Reputation: 388
How I can do special merge like this: (Where special-merge a function, received two object, return an object)
(def tab-a [
{:c '({:v 60} {:v nil})}
{:c '({:v 70} {:v 66})}
])
(def tab-b [
{:c '({:v 40} {:v 11})}
{:c '({:v 70} {:v 22})}
])
(special-merge tab-a tab-b)
=>
[
{:c ({:v 40} {:v nil} {:v 11})}
{:c ({:v 60} {:v nil} {:v nil})}
{:c ({:v 70} {:v 66} {:v 22})}
]
Thanks
Upvotes: 2
Views: 107
Reputation: 101072
I guess you could do it nicer:
(defn to-lookup [table]
(into {}
(for [t table] (apply hash-map ((comp (partial map :v) :c) t)))))
(defn create [lookups k]
(let [values (for [lookup lookups] (get lookup k nil))
l (map (partial hash-map :v) values)]
{:c (cons (hash-map :v k) l)}))
(defn special-merge [& ts]
(let [lookups (map to-lookup ts)
allkeys (->> lookups (mapcat keys) distinct sort)]
(map (partial create lookups) allkeys)))
Output:
user=> (pprint (special-merge tab-a tab-b))
({:c ({:v 40} {:v nil} {:v 11})}
{:c ({:v 60} {:v nil} {:v nil})}
{:c ({:v 70} {:v 66} {:v 22})})
nil
user=>
Upvotes: 1