   structures define -equiv (and thus =) as a value, not an identity,
   comparison."
   ([x] true)
-  ([x y] (or (identical? x y)
-             ^boolean (-equiv x y)))
+  ([x y]
+    (if (nil? x)
+      (nil? y)
+      (or (identical? x y)
+        ^boolean (-equiv x y))))
   ([x y & more]
      (if (= x y)
        (if (next more)

  ([coll k]
     (-dissoc coll k))
  ([coll k & ks]
     (let [ret (dissoc coll k)]
       (if ks
         (recur ret (first ks) (next ks))
         ret))))

(defn ^boolean fn? [f]
  (or ^boolean (goog/isFunction f) (satisfies? Fn f)))


    (string? o)
    (check-string-hash-cache o)

    (nil? o) 0

    :else
    (-hash o)))
