                 (run-iterator-prop min-keys key-len updates movements)))
 
 (defn run-self-join-prop [min-keys key-len updates]
-  (let [tree (apply-to-tree (tree min-keys key-len) updates)
+  (let [[tree _] (apply-to-tree (tree min-keys key-len) updates)
         solver (solver
                 key-len
                 #js [(contains (iterator tree) (into-array (range key-len)))
-                     (contains (iterator tree) (into-array (range key-len)))])]
-    (= (map vec (map first tree))
-       (map vec solver))))
+                     (contains (iterator tree) (into-array (range key-len)))])
+        tree-elems (.elems tree)]
+    (dotimes [i (alength tree-elems)]
+      (let [elem (aget tree-elems i)]
+        (when (number? elem)
+          (aset tree-elems i (* elem elem)))))
+    (prim= tree-elems (.elems solver))))
 
 (defn self-join-prop [key-len]
   (prop/for-all [min-keys gen/s-pos-int

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

;; COMPARISONS


  (reset [this solver constraint]
         (dotimes [i (alength vars)]
           (.set-watch solver (aget vars i) constraint true)))
  (val [this solver constraint]
       1)
  (split-left [this solver constraint]
              false)
  (split-right [this solver constraint])
