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

  {:match core/set?
   :description "a set"})

(defn assert-good-matcher [{:keys [match description describe-mismatch] :as matcher}]
  (assert (not (nil? matcher)) "Matcher should not be nil")
  (assert match

;;
;;  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) ")"))

