   "Returns the number of items in the collection. (count nil) returns
   0.  Also works on strings, arrays, and Maps"
   [coll]
-  (if (counted? coll)
-    (-count coll)
-    (accumulating-seq-count coll)))
+  (if-not (nil? coll)
+    (cond
+      (satisfies? ICounted coll false)
+      (-count ^not-native coll)
+
+      (array? coll)
+      (alength coll)
+    
+      (string? coll)
+      (alength coll)
+
+      (type_satisfies_ ICounted coll)
+      (-count coll)
+
+      :else (accumulating-seq-count coll))
+    0))
 
 (defn- linear-traversal-nth
   ([coll n]

     (prim-seq array i)))

(extend-type array
  ICounted
  (-count [a] (alength a))

  IReduce
  (-reduce [col f] (array-reduce col f))
  (-reduce [col f start] (array-reduce col f start)))


(extend-type string
  IHash
  (-hash [o] (goog.string/hashCode o)))

(deftype Keyword [k]
  IFn
