   (let [unchanged? (and (= (:plan old-state) (:plan new-state))
                         (every?
                          (fn [shape]
-                           (and (= (get-facts old-state :known|pretended shape) (get-facts new-state :known|pretended shape))
-                                (= (get-facts old-state :remembered shape) (get-facts new-state :remembered shape))
-                                (= (get-facts old-state :forgotten shape) (get-facts new-state :forgotten shape))))
+                           (and (arr= (get-facts old-state :known|pretended shape) (get-facts new-state :known|pretended shape))
+                                (arr= (get-facts old-state :remembered shape) (get-facts new-state :remembered shape))
+                                (arr= (get-facts old-state :forgotten shape) (get-facts new-state :forgotten shape))))
                          (get-in old-state [:plan :kind->shape :known])))]
     (js/console.timeEnd "unchanged?")
     unchanged?))

  (-seq [this]
        (keys (.-transient-map this))))

;; TODO facts and plans need to be serializable

;; FACTS

  (-equiv [this other]
          (and (instance? Fact other)
               (= shape (.-shape other))
               (arr= values (.-values other))))

  IHash
  (-hash [this]
