meander

hanDerPeder 2023-02-03T11:46:16.408489Z

I'm struggling translating this transform function to meander. It transform a list of heterogenous values into a different representation. Tried using scan with memory variables, but then I basically have to reimplement the mapping function in the meander expression. Any pointers?

(def data [{:value "hello"} {:foo 123}])

(defn transform [data]
  (mapv
   (fn [{:keys [value foo]}]
     (if value
       {:type :a :value value}
       {:type :b :foo-amount foo}))
   data))

(transform data) ; => [{:type :a, :value "hello"} {:type :b, :foo-amount 123}]

hanDerPeder 2023-02-04T10:23:01.631389Z

This works

xificurC 2023-02-03T11:59:53.267459Z

have a look at m/rewrites. Something like

(m/rewrites data
  {:value (m/pred some? ?v)} {:type :a, :value ?v}
  {:foo (m/pred some? ?foo)} {:type :b, :value ?foo})

hanDerPeder 2023-02-03T12:17:44.196679Z

nice thanks. the data list is actually nested inside some larger structure. can I inline rewrites? something like

(def data {:title "hello"
           :list
           [{:value "hello"} {:foo 123}]})


(match data
  {:title ?title
   :list (rewrite
          {:value (pred some? ?v)} {:type :a :value ?v}
          {:foo (pred some? ?foo)} {:type :b :foo-amount ?foo})}

  {:the-title? ?title
   ...?
   }
  )

hanDerPeder 2023-02-03T12:26:18.357429Z

or

(match data
  {:title ?title
   :list ?list}

  {:the-title? ?title
   :new-list (m/rewrites ?list
               {:value (m/pred some? ?v)} {:type :a :value ?v}
               {:foo (m/pred some? ?foo)} {:type :foo :foo-amount ?foo})})

hanDerPeder 2023-02-03T12:50:43.827459Z

hmm, can't seem to get this to work this works

(mean/rewrites {:value "hello"}
  {:value (mean/pred some? ?v)} {:type :a :value ?v}
  {:foo (mean/pred some? ?foo)} {:type :b :foo-amount ?foo}) ; => ({:type :a, :value "hello"})
and this gives the same output
(mean/rewrites [{:value "hello"} {:foo 123}]
  [{:value (mean/pred some? ?v)} & _] {:type :a :value ?v}
  [{:foo (mean/pred some? ?foo)} & _] {:type :b :foo-amount ?foo}) ; => ({:type :a, :value "hello"})
but not sure how to apply this for each element

xificurC 2023-02-03T13:12:05.958539Z

xificurC 2023-02-03T13:15:58.655479Z

tbh in this case I'd go with a partial solution like below. Not sure if meander gives you much here though

hanDerPeder 2023-02-03T13:18:44.090899Z

thanks for the help!

👍 1
xificurC 2023-02-03T13:23:02.700049Z

btw ctrl+shift+enter or type /snippet to create a collapsible snippet that can have syntax highlighting

hanDerPeder 2023-02-03T13:23:37.181329Z

cool didn't know that 👍