    :describe-mismatch
    standard-describe-mismatch})
 
+(defn is-in?
+  "passes if the value is included in the given collection
+
+  (matcha/run-match (matcha/is-in? [1]) 1) ; => passes
+  (matcha/run-match (matcha/is-in? [5]) 1) ; => fails"
+  [xs]
+  {:match #(core/some #{%} xs)
+   :description (str "one of " (pr-str xs))})
+
+(defn re-matches
+  "passes if the string matches the regex given
+
+  (matcha/run-match (matcha/is-in? #\"\\d+\") \"1\") ; => passes
+  (matcha/run-match (matcha/is-in? #\"\\d+\") \"a\") ; => fails"
+  [re]
+  (type-matcher
+    core/string?
+    "string"
+    {:match #(core/re-matches re %)
+     :description (str "a string matching " (pr-str re))}))
+
+(defn contains-string
+  "passes if the string includes the given string
+
+  (matcha/run-match (matcha/contains-string \"a\") \"a\") ; => passes
+  (matcha/run-match (matcha/contains-string \"a\") \"b\") ; => fails"
+  [s]
+  (type-matcher
+    core/string?
+    "string"
+    {:match #(.contains ^String % s)
+     :description (str "a string including " (pr-str s))}))
+
 (defn not
   "passes if the given matcher fails
   (matcha/run-match (matcha/not (matcha/= 1)) 1) ; => passes

    :exclude
    [empty? every?
     = some not <= >= < >
     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]))

            (and (pred x)
                 ((:match m) x)))
   :description (:description m)
   :describe-mismatch
   (fn [x]
     (if (pred x)
       ((:describe-mismatch m describe-class-mismatch) x)
       (str "not a " type-name ", " (describe-class-mismatch x))))})

(defn =
  "matches based on equality of the value given
