             (interpose [sep] (map #(print-one % opts) coll)))
           [end]))
 
-(extend-protocol IPrintable
-  goog.global.Boolean (-pr-seq [bool opts] (list (str bool)))
-  goog.global.Number (-pr-seq [n opts] (list (str n)))
-  string (-pr-seq [obj opts]
-                        (cond
-                          (keyword? obj)
-                            (list (str ":"
-                                       (when-let [nspc (namespace obj)]
-                                         (str nspc "/"))
-                                       (name obj)))
-                          (symbol? obj)
-                            (list (str (when-let [nspc (namespace obj)]
-                                         (str nspc "/"))
-                                       (name obj)))
-                          (get opts :readably)
-                            (list (goog.string.quote obj))
-                          :else (list obj)))
-  array (-pr-seq [a opts]
-                      (pr-sequential pr-seq "#<Array [" ", " "]>" opts a)))
-
 ; This should be different in different runtime envorionments. For example
 ; when in the browser, could use console.debug instead of print.
 (defn string-print [x]


(defn vector [& args] (vec args))

(extend-protocol IHash
  string (-hash [o] (goog.string/hashCode o))
  goog.global.Number (-hash [o] o))

(defn hash [o]
  (if o
    (-hash o)

  (assert (= (hash-map :foo 5)
             (assoc (cljs.core.ObjMap. nil (array) (js-obj)) :foo 5)))

  (assert (= "[1 true {:a 2, :b 42} #<Array [3, 4]>]"
             (pr-str [1 true {:a 2 :b 42} (array 3 4)])))
  (assert (= "symbol\"'string"
             (pr-str (str 'symbol \" \' "string"))))
  (assert (not (= "one" "two")))
