   (up [this]
       (assert (> key-ix 0))
       (set! key-ix (- key-ix 1))
+      (.maintain (aget key-ix->intersection key-ix))
       (let [iterator->present? (aget key-ix->iterator->present? key-ix)]
         (dotimes [i (alength iterator->present?)]
           (if (aget iterator->present? i)

  (dc/quick-check 10000 (trie-tree-prop 1))
  (dc/quick-check 10000 (trie-tree-prop 2))
  (dc/quick-check 10000 (trie-tree-prop 3))
  (dc/quick-check 100 (self-join-prop 1))
  (dc/quick-check 100 (self-join-prop 2))
  (dc/quick-check 100 (self-join-prop 3))


        join-results (apply-to-iterator
                      (treeterator (join #js [iterator-a iterator-b] key-len #js [(into-array (range key-len)) (into-array (range key-len))]))
                      movements)]
    (= (map vec iterator-results) (map vec join-results))))

(defn self-join-prop [key-len]
  (prop/for-all [min-keys gen/s-pos-int
                 actions (gen/vector (gen-action key-len))
                 movements (gen/vector (gen-next key-len))] ;; TODO use gen-movement once Treeterator supports seek
                (run-self-join-prop min-keys key-len actions movements)))


(comment
  (dc/quick-check 1000 (least-prop 1))
