   {:match core/set?
    :description "a set"})
 
+(def
+  ^{:doc
+    "passes if the value is a function
+
+    (matcha/run-match matcha/fn? #()) ; => passes
+    (matcha/run-match matcha/fn? 5) ; => fails"}
+  fn?
+  {:match core/fn?
+   :description "a function"})
+
 (defn assert-good-matcher [{:keys [match description describe-mismatch] :as matcher}]
   (assert (not (nil? matcher)) "Matcher should not be nil")
   (assert match

    :exclude
    [empty? every?
     = some not <= >= < >
     instance? string? map? seq? char? vector? nil? keyword? symbol? ratio? decimal? float? isa? rational? coll? set? list?])
  (:require [clojure.string :as string]
            [clojure.core :as core]))
;; Matcher

;;
;;  TODO: matchers list
;;  - all the matchers using `on` should have good error messages with bad types
;;  - re-matches
(defn describe-list [call xs]
  (str "(" call " " (clojure.string/join " " xs) ")"))

