Skip to content

Commit

Permalink
Fix metadata preservation
Browse files Browse the repository at this point in the history
Close #86
  • Loading branch information
SevereOverfl0w committed Feb 16, 2020
1 parent 7d0b5e9 commit 1749e71
Show file tree
Hide file tree
Showing 4 changed files with 50 additions and 6 deletions.
12 changes: 8 additions & 4 deletions src/aero/alpha/core.cljc
Original file line number Diff line number Diff line change
Expand Up @@ -22,22 +22,26 @@
(and (map? x) (not (record? x)))
(with-meta
(into [] x)
{`reassemble (fn [_ queue] (into {} queue))})
{`reassemble (fn [_ queue] (into (empty x) queue))})

(set? x)
(with-meta (map-indexed (fn [idx v] [idx v]) x)
{`reassemble (fn [_ queue]
(set (map second queue)))})
(into (empty x)
(map second queue)))})

(vector? x)
(with-meta (map-indexed (fn [idx v] [idx v]) x)
{`reassemble (fn [_ queue]
(mapv second (sort-by first queue)))})
(into (empty x)
(mapv second (sort-by first queue))))})

(seq? x)
(with-meta (map-indexed (fn [idx v] [idx v]) x)
{`reassemble (fn [_ queue]
(apply list (map second (sort-by first queue))))})
(with-meta
(apply list (map second (sort-by first queue)))
(meta x)))})
;; Scalar value
:else
nil))
Expand Down
2 changes: 1 addition & 1 deletion src/aero/core.cljc
Original file line number Diff line number Diff line change
Expand Up @@ -5,7 +5,7 @@
[aero.alpha.core :refer
[expand expand-scalar-repeatedly expand-case eval-tagged-literal
reassemble kv-seq]]
[clojure.walk :refer [walk postwalk]]
[aero.impl.walk :refer [postwalk]]
#?@(:clj [[clojure.edn :as edn]
[aero.impl.macro :as macro]]
:cljs [[cljs.tools.reader.edn :as edn]
Expand Down
22 changes: 22 additions & 0 deletions src/aero/impl/walk.cljc
Original file line number Diff line number Diff line change
@@ -0,0 +1,22 @@
(ns aero.impl.walk)

(defn- walk
[inner outer form]
(let [x (cond
(list? form) (outer (apply list (map inner form)))
#?@(:cljs [(map-entry? form) (outer (MapEntry. (inner (key form)) (inner (val form)) nil))]
:clj [(instance? clojure.lang.IMapEntry form) (outer (vec (map inner form)))])
(seq? form) (outer (doall (map inner form)))
#?(:cljs (record? form)
:clj (instance? clojure.lang.IRecord form))
(outer (reduce (fn [r x] (conj r (inner x))) form form))
(coll? form) (outer (into (empty form) (map inner form)))
:else (outer form))]
(if #?(:cljs (implements? IWithMeta x)
:clj (instance? clojure.lang.IObj x))
(with-meta x (merge (meta form) (meta x)))
x)))

(defn postwalk
[f form]
(walk (partial postwalk f) f form))
20 changes: 19 additions & 1 deletion test/aero/core_test.cljc
Original file line number Diff line number Diff line change
Expand Up @@ -8,7 +8,7 @@
#?(:clj (:import [aero.core Deferred]))
#?(:cljs (:require [aero.core :refer [read-config reader Deferred] :refer-macros [deferred]]
[cljs.tools.reader :as edn]
[cljs.test :refer [deftest is testing]]
[cljs.test :refer [deftest is testing are]]
[goog.object :as gobj]
[goog.string :as gstring]
goog.string.format
Expand Down Expand Up @@ -231,3 +231,21 @@
config (#?(:cljs source-logging-push-back-reader
:clj java.io.StringReader.) config-str)]
(is (= "bar" (:y (read-config config))))))

(deftest meta-preservation-test
(are [ds] (= ds
(::foo
(meta
(read-config
(#?(:cljs source-logging-push-back-reader
:clj java.io.StringReader.)
(binding [*print-meta* true]
(pr-str (with-meta ds {::foo ds}))))))))
[]
{}
#{}
()
[1]
{:a :b}
#{:a :b}
'(1)))

0 comments on commit 1749e71

Please sign in to comment.