   "Returns true if coll satisfies IReduce"
   (satisfies? IReduce coll))
 
+(defn- array-reduce
+  ([arr f]
+     (let [cnt (alength arr)]
+       (if (zero? (alength arr))
+         (f)
+         (loop [val (aget arr 0), n 1]
+           (if (< n cnt)
+             (let [nval (f val (aget arr n))]
+               (if (reduced? nval)
+                 @nval
+                 (recur nval (inc n))))
+             val)))))
+  ([arr f val]
+     (let [cnt (alength arr)]
+       (loop [val val, n 0]
+         (if (< n cnt)
+           (let [nval (f val (aget arr n))]
+             (if (reduced? nval)
+               @nval
+               (recur nval (inc n))))
+           val))))
+  ([arr f val idx]
+     (let [cnt (alength arr)]
+       (loop [val val, n idx]
+         (if (< n cnt)
+           (let [nval (f val (aget arr n))]
+             (recur nval (inc n)))
+           val)))))
+
 (defn counted? [coll]
   "Returns true if coll implements count in constant time"
   (satisfies? ICounted coll))

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

  ;; TODO: IKVReduce, etc.

  IFn
  (-invoke [coll k]

(defprotocol IReduce
  (-reduce [coll f] [coll f start]))

(defprotocol IKVReduce
  (-kv-reduce [coll f init]))

(defprotocol IPrintable
  (-pr-str [o]))

