                     (LeafNode. (aget ks 1)))))
   
   (lookup [_ key]
-    (let [idx (binary-search keys 0 (dec (alength keys)) key)]
-      (if (and (< idx (alength keys))
-                 (eq (aget keys idx) key))
-        idx
-        -1)))
-
-  (append [this ^number path _ key] ;; TODO figure out idx here
-    (let [idx    (path-get path 0)
+    (let [idx (lookup-exact keys key)]
+      (when-not (== -1 idx)
+        (aget keys idx))))
+
+  (conj [this key]
+    (let [idx    (lookup-insert-leaf keys key)
           keys-l (alength keys)]
       (cond
-        (eq key (aget keys idx)) ;; element already there
-          #js [this]
-        (== keys-l max-len) ;; splitting
+        ;; element already here
+        (and (< idx keys-l)
+             (eq key (aget keys idx)))
+          nil
+      
+        ;; splitting
+        (== keys-l max-len)
           (let [middle (half (inc keys-l))]
             (if (> idx middle)
               ;; new key goes to the second half

      (aset new-arr (+ i l1xs) (aget arr (+ splice-to i))))
    new-arr))

(defn cut ;; TODO use Array.prototype.slice etc
  (^array [^array arr ^number cut-from]
    (.slice arr cut-from))
  (^array [^array arr ^number cut-from ^number cut-to]

  (-lookup [set k]
    (-lookup set k nil))
  (-lookup [set k not-found]
    (binding [*cmp* (.-comparator set)]
      (or (.lookup (.-root set) k) not-found)))

  ISeqable
  (-seq [this]
