Guest User

Untitled

a guest
Jun 23rd, 2018
92
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 6.08 KB | None | 0 0
  1. (ns coarse.core
  2. (:require [coarse.cats :refer
  3. [pure pure? mk-identity
  4. mk-const mk-first mk-tuple
  5. just nothing nothing?
  6. cons' lift-pure
  7. fmap app traverse
  8. mempty mappend pure-from]]))
  9.  
  10. (defn & [f n] (n f))
  11.  
  12. (defn lens [get set]
  13. ; get :: (s -> a)
  14. ; set :: (s -> b -> t)
  15. (let [g (fn [f s]
  16. ; f : (a -> f b)
  17. (let [a (get s)
  18. fb (f a)
  19. b->t (partial set s)]
  20. (fmap b->t fb)))]
  21. (fn
  22. ([x] (partial g x))
  23. ([x y] (g x y)))))
  24.  
  25. (defn _pred [p1 p2]
  26. (letfn [(g [f s']
  27. (let [s (map-indexed
  28. vector s')
  29. hint (:type (f (first s')))]
  30. (letfn [(upd [[ind ele]]
  31. (if (and (p1 ind) (p2 ele))
  32. (f ele)
  33. (pure-from hint ele)))]
  34. (traverse upd s))))]
  35. (fn
  36. ([a b] (g a b))
  37. ([a] (partial g a)))))
  38.  
  39. (def _index (fn [x] (_pred x (constantly true))))
  40. (def _filtering (partial _pred (constantly true)))
  41. (defn _taking [n] (_index #(< % n)))
  42. (defn _dropping [n] (_index #(>= % n)))
  43. (defn _ranging [coll] (_index #(some #{%} coll)))
  44. (defn _all [v] (_filtering (partial = v)))
  45.  
  46. (defn ix [n]
  47. (let [get #(get % n)
  48. set (fn [s b]
  49. (assoc (doall s) n b))]
  50. (lens get set)))
  51.  
  52. (defn nx [n]
  53. (let [get #(nth % n)
  54. set (fn [s b]
  55. (assoc (doall s) n b))]
  56. (lens get set)))
  57.  
  58. (defn preview [lns s]
  59. (let [v (-> (lns (fn [x] (mk-const (mk-first (just x)))) s)
  60. :value
  61. :value)]
  62. (if (nil? v)
  63. nothing
  64. v)))
  65.  
  66. (defn has? [lns s]
  67. (let [v (preview lns s)]
  68. (if (or (nil? v) (nothing? v))
  69. false
  70. true)))
  71.  
  72. (defn filtered [pred]
  73. (letfn [(g [f s]
  74. (let [hint (:type (f s))]
  75. (if (pred s)
  76. (f s)
  77. (pure-from hint s))))]
  78. (fn
  79. ([f] (partial g f))
  80. ([f s] (g f s)))))
  81.  
  82. (def _1 (ix 0))
  83. (def _2 (ix 1))
  84. (def _3 (ix 2))
  85. (def _4 (ix 3))
  86. (def _5 (ix 4))
  87.  
  88. (defn <%- [lns f s]
  89. (:value
  90. (lns (fn [x]
  91. (let [fx (f x)]
  92. (mk-tuple fx fx))) s)))
  93.  
  94. (defn <<%- [lns f s]
  95. (:value
  96. (lns (fn [x] (mk-tuple x (f x))) s)))
  97.  
  98. (def _first _1)
  99. (def _last
  100. (lens
  101. last
  102. (fn [x v] (assoc x (dec (count x)) v))))
  103.  
  104. (def _rest
  105. (lens
  106. rest
  107. (fn [[hd & _] v] (cons hd v))))
  108.  
  109. (def _butlast
  110. (lens
  111. butlast
  112. (fn [coll v] (conj v (last coll)))))
  113.  
  114. (defn ix-default [n default]
  115. (let [get (fn [x] (or (get x n) default))
  116. set (fn [s b] (assoc s n b))]
  117. (lens get set)))
  118.  
  119. (defn hcomp2 [f g]
  120. (fn [hd & rst_]
  121. (let [rst (if (nil? rst_) [] rst_)]
  122. (apply (partial f (g hd)) rst))))
  123.  
  124. (defn wrap-lens [x]
  125. (if (or (keyword? x) (integer? x))
  126. (ix x)
  127. x))
  128.  
  129. (defn hcomp [& fns']
  130. (let [fns (map wrap-lens fns')]
  131. (cond
  132. (empty? fns) identity
  133. (= (count fns) 1) (first fns)
  134. :else
  135. (let [b (last fns)
  136. a (apply hcomp (butlast fns))]
  137. (hcomp2 a b)))))
  138.  
  139. (defn attrs [& form]
  140. (apply hcomp (map ix form)))
  141.  
  142. (defn over [lns a->b s]
  143. (:value ((wrap-lens lns) (comp mk-identity a->b) s)))
  144.  
  145. (defn sett [lns b s]
  146. (over lns (constantly b) s))
  147.  
  148. (defn view [lns s]
  149. (:value ((wrap-lens lns) mk-const s)))
  150.  
  151. (defn to [getter]
  152. (lens getter (constantly nil)))
  153.  
  154. (defn views
  155. ([l f] (partial view (hcomp l (to f))))
  156. ([l] (partial views l)))
  157.  
  158. (defn join [& lenses]
  159. (lens
  160. (fn [s]
  161. (mapv #(view % s) lenses))
  162. (fn [s b]
  163. ; s is the original structure
  164. ; b is a list of "inputs" for the lenses to set
  165. (letfn [(g [s'
  166. [lh & ls] ;; the lenses
  167. [bh & bs]] ;; the inputs
  168. (if (nil? lh)
  169. s'
  170. (g
  171. (sett lh bh s')
  172. ls bs)))]
  173. (g s lenses b)))))
  174.  
  175. ; FIXME: hack to force nil value to become a list
  176. (defn to-list-of
  177. ([lns s]
  178. (let [v (:value ((wrap-lens lns) (fn [x] (mk-const [x])) s))]
  179. (if (nil? v) [] v)))
  180. ([lns] (partial to-list-of lns)))
  181.  
  182. ;; maths operators
  183.  
  184. (defn ?= [fn]
  185. (letfn [(anon
  186. ([l n s] (over l (partial fn n) s))
  187. ([l n] (partial anon l n)))]
  188. anon))
  189.  
  190. (def += (?= +))
  191. (def -= (?= (fn [a b] (- b a))))
  192. (def *= (?= *))
  193. (def div= (?= (fn [a b] (/ b a))))
  194. (def quot= (?= (fn [a b] (/ b a))))
  195. (def =% sett)
  196.  
  197. ;; states
  198.  
  199. (defn state [f]
  200. {:value f :type :state})
  201.  
  202. (defn run-state
  203. ([v] (:value v))
  204. ([v arg] ((:value v) arg)))
  205.  
  206. (defn exec-state [a b]
  207. (second (run-state a b)))
  208.  
  209. (defn eval-state [a b]
  210. (first (run-state a b)))
  211.  
  212. (defn state-return
  213. ([x] (state (fn [s] [x s])))
  214. ([x s] [x s]))
  215.  
  216. (defn bind [p k]
  217. (state
  218. (fn [s0]
  219. (let [[x s1] (run-state p s0)]
  220. (run-state (k x) s1)))))
  221.  
  222. (defn chain [p k]
  223. (bind p (fn [_] k)))
  224.  
  225. (def state-get
  226. (state (fn [s] [s s])))
  227.  
  228. (defn state-put
  229. ([x] (state (fn [_] [[] x])))
  230. ([x s] [[] x]))
  231.  
  232. (defn state-modify [f]
  233. (bind state-get (fn [x] (state-put (f x)))))
  234.  
  235. (defn state-gets [f]
  236. (bind state-get (fn [x] (state-return (f x)))))
  237.  
  238. (defn state-view [lns]
  239. (bind state-get
  240. (fn [s] (state-return (view lns s)))))
  241.  
  242. (defmacro lens-do
  243. [& forms]
  244. (let [hd (first forms)
  245. tl (rest forms)]
  246. (if (coll? hd)
  247. ; a collection
  248. (if (empty? tl)
  249. hd
  250. (cond
  251. (= (first hd) '<=)
  252. `(bind (state-view ~(nth hd 2))
  253. (fn [~(second hd)]
  254. (lens-do ~@tl)))
  255. (= (first hd) '<-)
  256. `(bind ~(nth hd 2)
  257. (fn [~(second hd)]
  258. (lens-do ~@tl)))
  259. :else
  260. `(chain ~hd (lens-do ~@tl)))))))
  261.  
  262. (def magnify views)
  263.  
  264. (defn zoom [lns state]
  265. (lens-do
  266. (<= ele lns)
  267. (<- orig state-get)
  268. (state-put (sett lns (exec-state state ele) orig))))
  269.  
  270. ;; state operators
  271.  
  272. (defn ?== [f]
  273. (fn [l b] (state-modify (f l b))))
  274.  
  275. (defn =$ [l b] (state-modify (partial sett l b)))
  276. (def +== (?== +=))
  277. (def -== (?== -=))
  278. (def *== (?== *=))
  279. (def div== (?== div=))
  280. (def quot== (?== quot=))
  281.  
  282. ;; aliases
  283. (def *> hcomp)
  284. (def *- attrs)
  285. (def each traverse)
Add Comment
Please, Sign In to add comment