3 ms·
Yup, lots of temporaries (I haven't written much Clojure recently, so I'm sure I'm missing lots of simplifying core fns). (let [; input js (cheshire.
by tekacs 10y ago
Yup, lots of temporaries (I haven't written much Clojure recently, so I'm sure I'm missing lots of simplifying core fns).
(let [; input
js (cheshire.core/parse-string (slurp (clojure.java.io/resource "awful.json")))
; utils
get-match (fn [k v coll] (first (filter #(= (get % k) v) coll)))
model-for (fn [title toplevel] (get-match "title" title (toplevel "models")))
key-for (fn [name* model] ((get-match "name" name* (model "fields")) "key"))
; models
fruit-model (model-for "fruits" js)
farmer-model (model-for "farmers" js)
; keys
fruit-name-key (key-for "Name" fruit-model)
farmer-name-key (key-for "Full name" farmer-model)
farmer-fruits-key (key-for "Fruits" farmer-model)
; values
bob-entity (get-match farmer-name-key "Bob, the farmer" (farmer-model "entities"))
bob-fruit-keys (bob-entity farmer-fruits-key)
bob-fruit-entities (map #(get-match "_id" % (fruit-model "entities")) bob-fruit-keys)
bob-fruit-names (map #(% fruit-name-key) bob-fruit-entities)]
bob-fruit-names)
=> ("Orange")