Guest User

Untitled

a guest
Feb 19th, 2018
84
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 1.00 KB | None | 0 0
  1. (ns trees
  2. (:require [clojure.walk :as walk]))
  3.  
  4. (defonce id (atom 0))
  5.  
  6. (defrecord Ref [id])
  7.  
  8. (defn new-id! []
  9. (->Ref (swap! id inc)))
  10.  
  11. (defmethod print-method Ref [this ^java.io.Writer w]
  12. (.write w "#ref")
  13. (.write w " ")
  14. (print-method (:id this) w))
  15.  
  16. (defn hydrate
  17. [{:keys [tree lookup]}]
  18. (walk/prewalk-replace lookup tree))
  19.  
  20. (defn dehydrate
  21. [tree]
  22. (let [nodes (tree-seq coll?
  23. #(if (map? %) (vals %) (seq %))
  24. tree)
  25. lookup (into {}
  26. (->> nodes
  27. frequencies
  28. (remove #(<= (second %) 1))
  29. #_ (remove #(<= (count (with-out-str (prn %)))
  30. 100))
  31. (map #(vector (first %) (new-id!)))))]
  32.  
  33. {:tree (walk/prewalk-replace lookup tree)
  34. :lookup (into {} (map (comp vec reverse) lookup))}))
  35.  
  36. #_ (prn (dehydrate {:a {:b 2} :x [{:b 2}]}))
  37. #_ (prn (hydrate (dehydrate {:a {:b 2} :x [{:b 2}]})))
Add Comment
Please, Sign In to add comment