   (-reduce [coll f] (ci-reduce coll f start))
   (-reduce [coll f start] (ci-reduce coll f start))
 
-  ;; TODO: IKVReduce, etc.
+  IKVReduce
+  (-kv-reduce [coll f init]
+    (let [len (-count coll)]
+      (loop [i 0
+             v init]
+        (if (< i len)
+          (recur (inc i) (f v i (-nth i coll)))
+          v))))
 
   IFn
   (-invoke [coll k]

  "Returns true if coll satisfies IReduce"
  (satisfies? IReduce coll))

(defn counted? [coll]
  "Returns true if coll implements count in constant time"
  (satisfies? ICounted coll))

  IReduce
  (-reduce [coll f start]
    (throw "-reduce on a map: stub"))

  IKVReduce
  (-kv-reduce [coll f init]
    (let [pairs (hamt/pairs)
          len (alength pairs)]
      (loop [i    0
             prev init]
        (if (< i len)
          (let [pair (aget pairs i)
                k    (aget pair 0)
                v    (aget pair 1)]
            (recur
              (inc i)
              (f prev k v)))))))
  
  IPrintable
  (-pr-str [coll]
