   (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])

(defn run-product-join-prop [min-keys key-len updates]
  (let [product-tree (tree min-keys key-len)
        [tree _] (apply-to-tree (tree min-keys key-len) updates)
        elems (.elems tree)
        _ (dotimes [i (alength elems)]
            (dotimes [j (alength elems)]
              (when (and (== 0 (mod i 2)) (== 0 (mod j 2)))
                (.update product-tree (.concat (aget elems i) (aget elems j)) (* (aget elems (+ i 1)) (aget elems (+ j 1)))))))
        solver (solver
                (* 2 key-len)
                #js [(contains (iterator tree) (into-array (range 0 key-len)))
                     (contains (iterator tree) (into-array (range key-len (* 2 key-len))))])]
    (prim= (.elems product-tree) (.elems solver))))

(defn product-join-prop [key-len]
  (prop/for-all [min-keys gen/s-pos-int

  (reset [this key]
         (set! node (.-root tree))
         (set! ix 0))
  (seek-gt [this key]
           (loop []
             (if (and (instance? Node (.-parent node))
