Skip to content

Instantly share code, notes, and snippets.

@JJ-Atkinson
Last active March 28, 2020 23:29
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save JJ-Atkinson/87f7b7edcd4157af3364297bbab4c880 to your computer and use it in GitHub Desktop.
Save JJ-Atkinson/87f7b7edcd4157af3364297bbab4c880 to your computer and use it in GitHub Desktop.
(ns cs101-clojureworkspace.meander-test
(:require [meander.epsilon :as m]
[zprint.core :as zp]))
(defn create-data [class numbers & [count?]]
{:class class :numbers numbers :count? (or count? false)})
(def data (mapv (partial apply create-data)
[[:a [1 2 3 4] true]
[:b [1 2] true]
[:a [88] true]
[:b [900] false]]))
(defn sum [xs]
(reduce + xs))
(defn normal-way [datas]
(->> datas
(filter :count?)
(group-by :class)
vals
(map (partial reduce
(fn [x y]
(update x :numbers
(partial concat (:numbers y))))))
(map #(update % :numbers sum))))
(comment
(zp/czprint data 60)
(normal-way data)
; ({:class :a, :numbers 98, :count? true}
; {:class :b, :numbers 3, :count? true})
(m/search
data
(m/scan
{:class ?class
:numbers [!nums ...]
:count? true})
{:class ?class
:numbers (sum !nums)})
; =>
; ({:class :a, :numbers 10}
; {:class :b, :numbers 3}
; {:class :a, :numbers 88})
)
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment