     (mapa offset-map syms))
   (-copy-tuple [_ tuple idxs target target-idxs]
     (dotimes [i (shim/alength idxs)]
-      (shim/aset target (shim/aget target-idxs i) (shim/aget tuple (shim/aget idxs i))))))
+      (shim/aset target (shim/aget target-idxs i) (shim/aget tuple (shim/aget idxs i)))))
+  (-union [_ rel]
+    (assert (instance? ArrayRelation rel))
+    (assert (= offset-map (:offset-map rel)))
+    (ArrayRelation. offset-map (concat coll (:coll rel)))))
 
 #?(:clj
    (defmethod print-method ArrayRelation [rel w]

    (mapa offset-map syms))
  (-copy-tuple [_ tuple idxs target target-idxs]
    (dotimes [i (shim/alength idxs)]
      (shim/aset target (shim/aget target-idxs i) (nth tuple (shim/aget idxs i))))))

(defn coll-rel [symbols coll]
  (let [offset-map (reduce-kv

  (-size       [_])
  (-getter     [_ symbol])
  (-indexes    [_ symbols])
  (-copy-tuple [_ tuple idxs target target-idxs])
  (-union      [_ rel]))

;; (defn- #?@(:clj  [^long hash-arr]
;;            :cljs [^number  hash-arr]) [arr]
