   ISeqable
   (-seq [coll]
     (when (> (.length keys) 0)
-      (hash-map-seq coll 0)))
+      (let [hash-map-seq
+             (fn hash-map-seq [i]
+               (lazy-seq
+                 (when (< i (.length keys))
+                   (cons
+                     (vector (aget keys i) (-lookup coll (aget keys i)))
+                     (hash-map-seq (inc i))))))]
+        (hash-map-seq 0))))
 
   ICounted
   (-count [coll] (.length keys))
 
   ILookup
-  (-lookup [coll k] (-lookkup coll k nil))
+  (-lookup [coll k] (-lookup coll k nil))
   (-lookup [coll k not-found]
     (if (goog.isString k)
       (if (.hasOwnProperty strobj k)
         (aget strobj k)
         not-found)
-      "tbd-non-string-key"))
+      ; non-string key
+      (let [h (hash k)
+            bucket (aget hashobj h)
+            i (when bucket (scan-array 2 k bucket))]
+        (if i
+          (aget bucket (inc i))
+          not-found))))
 
   IAssociative
   (-assoc [coll k v]


(defn vector [& args] (vec args))

(defn- hash-map-seq [hash-map i]
  (lazy-seq
    (when (< i (.length (.keys hash-map)))
      (cons
        (vector (aget (.keys hash-map) i)
                (-lookup hash-map (aget (.keys hash-map) i)))
        (hash-map-seq hash-map (inc i))))))

; Keys is an array of all keys of this map, in no particular order.
; Any string key is stored along with its value in strobj. If a string key is


(defprotocol IMap
  #_(-assoc-ex [coll k v])
  (-dissoc [coll k]))

(defprotocol ISet
  (-contains? [coll v])
