 (defprotocol IReduce
   (-reduce [coll f] [coll f start]))
 
+(defprotocol IKVReduce
+  (-kv-reduce [coll f init]))
+
 (defprotocol IEquiv
   (-equiv [o other]))
 

    (ci-reduce v f))
  (-reduce [v f start]
    (ci-reduce v f start))

  IFn
  (-invoke [coll k]

       (seq-reduce f coll))
    ([coll f start]
       (seq-reduce f start coll))))

(deftype Reduced [val]
  IDeref
  (-deref [o] val))

(defn reduced?
  "Returns true if x is the result of a call to reduced"
  [r]
  (instance? Reduced r))

(defn reduced
  "Wraps x in a way such that a reduce will terminate with the value x"
  [x]
  (Reduced. x))

;;; Math - variadic forms will not work until the following implemented:
;;; first, next, reduce
