tailrecursion / cljson

Clojure/ClojureScript library for accelerated browser data deserialization
62 stars 4 forks source link

What is the correct way to support using cljs-priority-map objects with cljson? #11

Closed ninjudd closed 9 years ago

ninjudd commented 9 years ago

It looks like they are just serialized as standard maps by default.

ninjudd commented 9 years ago

The following seems to work:

(ns app.core
  (:require [tailrecursion.priority-map :refer [priority-map]]
            [tailrecursion.cljson :refer [clj->cljson EncodeTagged encode]]))

(extend-protocol EncodeTagged
  tailrecursion.priority-map.PersistentPriorityMap
  (-encode [o] (array "tailrecursion.priority-map" (encode (.-item->priority o)))))

Should something like this be added to cljs-priority-map or cljson? What about round-tripping priority-maps from Clojure?

alandipert commented 9 years ago

Hello :smile:

I don't think we want to add support for any types that aren't in both Clojure and ClojureScript, reserving extension for application writers. I think it's also good to not have dependencies.

To decode on the Clojure side in your application, you could do something like this:

Using [org.clojure/data.priority-map "0.0.7"] and [tailrecursion/cljson "1.0.7"]

(require '[clojure.data.priority-map :as pm]
              '[tailrecursion.cljson :as cljson])

(defn read-pm [m] 
  (into (pm/priority-map) m))

(defn my-decode [x] 
  (binding [*data-readers* {'tailrecursion.priority-map #'read-pm}] 
    (cljson/decode x)))

(my-decode ["tailrecursion.priority-map" {1 2 3 4}])