   (= x (fact (id->fact-shape ::eg) #js ["a" "b" "c"]))
   (= x (fact eg #js ["a" "b" "c"]))
   (= x (->eg "a" "b" "c"))
+  (= (Fact. nil #js ["a" "b" "c"]) (Fact. nil #js ["a" "b" "c"]))
+
+  (= x (Fact. nil #js ["a" "b" "c"]))
+  (= x (Fact. eg #js ["a" "b" 0]))
+  (= x (fact (fact-shape ::foo "[a] has a [b] with a [c]") #js ["a" "b" "c"]))
 
   (fact-ixes x #js [2 1])
   )

  (get x :b)


  (fact (fact-shape ::eg "[a] has a [b] with a [c]") #js ["a" "b" "c"])

  (= x x)

  IEquiv
  (-equiv [this other]
          (and (instance? Fact other)
               (= shape (.-shape other))
               (== (alength values) (alength (.-values other)))
               (loop [i 0]
                 (if (>= i (alength values))
                   true
                   (if (= (aget values i) (aget (.-values other) i))
                     (recur (+ i 1))
                     false)))))

  IHash
  (-hash [this] (caching-hash this hash-array __hash))
