+;; Some of Clojure's internal types are also acting as domain values.
+;; The map to the corresponding behaviour of the given type in the
+;; role of an generator.
+ ;; Sequences are considered as tuples of generated values.
+ ;; Shrink one after the other.
+ (value [this] (map value this))
+ (shrink [this] (mapcat shrink this))
+ ;; Maps are also acting as domain values. The keys are fixed
+ ;; but the values are domain values. Again we try to shrink
+ ;; here one after the other.
+ (value [this] (into (empty this) (for [[k v] this] [k (value v)])))
+ (shrink [this] (for [[k v] this sv (shrink v)] (assoc this k sv))))
(arbitrary [this size] (DomainValue. this (this size)))