 
 (defprotocol IMap
   #_(-assoc-ex [coll k v])
-  (-without [coll k]))
+  (-dissoc [coll k]))
 
 (defprotocol ISet
   (-contains? [coll 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

  ISeqable
  (-seq [coll]
    (when (> (.length keys) 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] (-lookup coll k nil))
  (-lookup [coll k not-found]
    (if (goog.isString k)
      (if (.hasOwnProperty strobj k)
        (aget strobj k)
        not-found)
      ; 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]
