Raphael Boukara
Raphael Boukara

Reputation: 388

clojure union between object

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

Answers (1)

sloth
sloth

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

Related Questions