   (let [[coordinates validations] validation-vec]
     (partition-all 2
       (mapcat (fn [[validation-fn opt-map]]
-                (raw-validation t coordinates validation-fn (merge {::coordinates coordinates} opt-map)))
+                (raw-validation t coordinates validation-fn (assoc opt-map ::coordinates coordinates)))
               validations))))
+
+(def ^:dynamic *mapper-fn* mapcat)
 
 (defn validation-seq
   "Create a lazy sequence of validating a given data structure

(ns themis.core
  (require [themis.protocols :as protocols]
           [themis.extended-protos :as e-protos]
           [themis.rules :as rules]))


  (require '[themis.predicates :as preds])

  (def paul-rules [[[:name :first] [[presence {:response {:text "First name is not there"}}]
                                    (fn [t-map data-point opt-map](Thread/sleep 1000)(and (= data-point "Paul")
                                                                        {:a 1 :b 2}))]]
                   [[:pets 0] [(from-predicate preds/longer-than? 20 "Too short; Needs to be longer than 20")]]
                   [[:pets 0 0] [[::w-pets {:pet-name-starts ""}]
                                 (from-predicate char?)
                                 (from-predicate #(or (Thread/sleep 2000) (= % \w)) "The first letter is not `w`")]]
                   ;[[:*] ['degrandis-pets]] ;This is valid, but we can also just write:
                   [:* 'degrandis-pets]])

  (def normal-paul-rules (rules/normalize paul-rules))
  (type (validation-seq paul paul-rules))
  (time (validation paul paul-rules))
  (time (pvalidation paul paul-rules))
  (mapcat identity (validation paul paul-rules (partial filter second)))
  (validation paul paul-rules (partial keep second))
  

  (defn unfold-result
    "Unfold the themis results map, expanding coordinates to nested maps,
