-
Notifications
You must be signed in to change notification settings - Fork 4
/
util.cljc
44 lines (39 loc) · 1.02 KB
/
util.cljc
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
(ns darkleaf.effect.util
(:require
[darkleaf.effect.core :refer [break !]])
#?(:cljs (:require-macros [darkleaf.effect.util :refer [->!]])))
(defmacro ->! [x & forms]
(let [forms! (map (fn [form] `(-> ~form !))
forms)]
`(-> (! ~x) ~@forms!)))
(defn reduce!
([ef coll]
(break
(case (count coll)
0 (! (ef))
1 (first coll)
(! (reduce! ef (first coll) (rest coll))))))
([ef val coll]
(break
(loop [acc val
coll coll]
(cond
(reduced? acc)
(unreduced acc)
(empty? coll)
acc
:else
(recur (! (ef acc (first coll)))
(rest coll)))))))
(defn mapv!
([ef coll]
(break
(let [reducer (fn [acc item]
(break
(conj! acc (! (ef item)))))
acc (transient [])
result (! (reduce! reducer acc coll))]
(persistent! result))))
([ef coll & colls]
(->> (apply map list coll colls)
(mapv! #(apply ef %)))))