             [cemerick.double-check.properties :as prop :include-macros true]
             [cemerick.pprng :as pprng]
             clojure.set)
-  (:require-macros [aurora.macros :refer [debug check apush apush* amake aclear typeof set!! dofrom]]))
+  (:require-macros [aurora.macros :refer [debug check apush apush* amake aclear typeof set!! dofrom perf-time]]))
 
 ;; COMPARISONS
 

            (let [i (+ i 2)]
              (.assoc! tree3 #js [(+ i 1) (+ i 2)] (* 2 i))))
        ]
    (time
     (dotimes [i 100]
       (let [j (join #js [(iterator tree1) (iterator tree2) (iterator tree3)] 3 #js [#js [true true true] #js [true false true] #js [false true true]])]
         (iterator->keys j))))
  )

  (let [tree1 (tree 10)
          _ (dotimes [i 100000]

                               (val-lt (aget his ix) (aget los ix)))
                       (set! failed? true))))
                 changed?))
  (split [this]
         (debug :splitting-left los his)
         (apush pushed-los (aclone los))
         (apush pushed-his (aclone his))
         (set! depth (+ depth 1))
         (loop [splitter 0]
           (if (< splitter (alength constraints))
             (do
               (.write-bounds this splitter)
               (.split-left (aget constraints splitter) (aget constraint->los splitter) (aget constraint->his splitter))
               (if (true? (.read-bounds this splitter))
                 (do
                   (apush pushed-splitters splitter)
                   (debug :split-left los his splitter))
                 (recur (+ splitter 1))))
             (assert false "Can't split anything!"))))
  (backtrack [this]
             (set! los (.pop pushed-los))
             (set! his (.pop pushed-his))
