 ;; ### Ideal usage
 ;; See the comment block below, but `(validation my-ds ds-rule-vec)`
 
+(defn simple-predicate
+  "Given a simple predicate function that takes a single arg,
+  return a proper validation function for it"
+  [f]
+  (fn [_ data-point _] (f data-point)))
+
 (defn navigate
   "Fetch the data from within a data structure given coordinates.
   Note: Tuck our internal protocols behind a function for consumption"


  (def valid-paul [[[:name :first] [(fn [t-map data-point opt-map] (and (= data-point "Paul")
                                                                        {:a 1 :b 2}))]]
                   [[:pets 0 0] [::w-pets {:pet-name-starts ""}]]
                   ;[[:*] ['degrandis-pets]] ;This is valid, but we can also just write:
                   [:* 'degrandis-pets]])


  pull apart the constituents and apply a `raw-validation`,
  returning back the validation result vector"
  [t validation-vec]
  (let [[coordinates validations] validation-vec]
    (mapcat identity (map (fn [[validation-fn opt-map]]
                            (raw-validation t coordinatesvalidation-fn (merge {::coordinates coordinates} opt-map)))
                          (partition-all 2 validations)))))

(defn validation-seq
  "Create a lazy sequence of validating a given data structure
