                   (aset outer-key (aget inner->outer inner-ix) (aget new-key inner-ix))))))
   (reset [this]
          (.reset iterator)
+         (dotimes [i (alength outer-key)]
+           (aset outer-key i least))
          (.maintain this))
   (key [this]
        outer-key)

;; On seek, point to first key greater than or equal to seek-key, or otherwise the last key
;; NOTE iterators are not write-safe unless reset after writing

;; TODO think we might need to be able to get last key on end
(deftype Iterator [tree ^:mutable node ^:mutable ix ^:mutable end? key-len]
  Object
  (reset [this]


(deftype Node [parent parent-ix keys vals children ^:mutable lower ^:mutable upper]
  Object
  (assoc! [this key val max-keys]
          (let [ix (key-find keys key)]
            (if (and (< ix (alength keys)) (key= key (aget keys ix)))
              (do
                (aset vals ix val)
