   (-equiv [coll other] (equiv-sequential coll other))
 
   IHash
-  (-hash [coll] (caching-hash coll hash-coll __hash))
+  (-hash [coll] (caching-hash coll hash-ordered-coll __hash))
 
   ISeqable
   (-seq [coll] coll)
-
+  
   IReduce
   (-reduce [coll f] (seq-reduce f coll))
   (-reduce [coll f start] (seq-reduce f start coll)))

(deftype Symbol [ns name str ^:mutable _hash _meta]
  Object
  (toString [_] str)
  IEquiv
  (-equiv [_ other]
    (if (instance? Symbol other)
      (identical? str (.-str other))
      false))
  IFn
  (-invoke [sym coll]
    (-lookup coll sym nil))
  (-invoke [sym coll not-found]
    (-lookup coll sym not-found))
  IMeta
  (-meta [_] _meta)
  IWithMeta
  (-with-meta [_ new-meta] (Symbol. ns name str _hash new-meta))
  IHash
  (-hash [sym]
    (caching-hash sym hash-symbol _hash))
  INamed
  (-name [_] name)
  (-namespace [_] ns)
  IPrintWithWriter
  (-pr-writer [o writer _] (-write writer str)))


          (recur ret (first ks) (next ks))
          ret)))))

(defn ^boolean empty?
  "Returns true if coll has no items - same as (not (seq coll)).
  Please use the idiom (seq x) rather than (not (empty? x))"
