 
 (set! js/cljs.core.ObjMap.HASHMAP_THRESHOLD 8)
 
+
+;; EXPERIMENTAL: subject to change
+(deftype Iterator [^:mutable s]
+  Object
+  (next [_]
+    (if-not (nil? s)
+      (let [x (first s)]
+        (set! s (next s))
+        #js {:value x :done false})
+      #js {:value nil :done true})))
+
+(defn iterator [coll]
+  (Iterator. (seq coll)))
+
+;; EXPERIMENTAL: subject to change
+(deftype EntriesIterator [^:mutable s]
+  Object
+  (next [_]
+    (if-not (nil? s)
+      (let [[k v] (first s)]
+        (set! s (next s))
+        #js {:value #js [k v] :done false})
+      #js {:value nil :done true})))
+
+(defn entries-iterator [coll]
+  (EntriesIterator. (seq coll)))
+
+;; EXPERIMENTAL: subject to change
+(deftype SetEntriesIterator [^:mutable s]
+  Object
+  (next [_]
+    (if-not (nil? s)
+      (let [x (first s)]
+        (set! s (next s))
+        #js {:value #js [x x] :done false})
+      #js {:value nil :done true})))
+
+(defn set-entries-iterator [coll]
+  (SetEntriesIterator. (seq coll)))
 (set! js/cljs.core.ObjMap.fromObject (fn [ks obj] (ObjMap. nil ks obj 0 nil)))
 
 ;;; PersistentArrayMap

  Object
  (toString [coll]
    (pr-str* coll))

  IList


  Object
  (toString [coll]
    (pr-str* coll))
  (equiv [this other]
    (-equiv this other))

  IMeta
  (-meta [coll] meta)
