0 | module Control.Lens.Traversal
2 | import Control.Monad.State
4 | import Data.Profunctor
5 | import Data.Profunctor.Traversing
6 | import Control.Applicative.Backwards
7 | import Control.Applicative.Indexing
8 | import Control.Lens.Optic
9 | import Control.Lens.Indexed
10 | import Control.Lens.Optional
11 | import Control.Lens.Lens
12 | import Control.Lens.Prism
23 | record IsTraversal p where
24 | constructor MkIsTraversal
25 | runIsTraversal : Traversing p
28 | traversalToOptional : IsTraversal p => IsOptional p
29 | traversalToOptional @{MkIsTraversal _} = MkIsOptional %search
32 | indexedTraversal : IsTraversal p => IsTraversal (Indexed i p)
33 | indexedTraversal @{MkIsTraversal _} = MkIsTraversal %search
38 | 0 Traversal : (s,t,a,b : Type) -> Type
39 | Traversal = Optic IsTraversal
43 | 0 Traversal' : (s,a : Type) -> Type
44 | Traversal' = Simple Traversal
49 | 0 IndexedTraversal : (i,s,t,a,b : Type) -> Type
50 | IndexedTraversal = IndexedOptic IsTraversal
54 | 0 IndexedTraversal' : (i,s,a : Type) -> Type
55 | IndexedTraversal' = Simple . IndexedTraversal
64 | traversal : (forall f. Applicative f => (a -> f b) -> s -> f t) -> Traversal s t a b
65 | traversal f @{MkIsTraversal _} = wander f
69 | itraversal : (forall f. Applicative f => (i -> a -> f b) -> s -> f t) -> IndexedTraversal i s t a b
70 | itraversal f @{MkIsTraversal _} @{ind} = wander (f . curry) . indexed @{ind}
76 | iordinal : Num i => Traversal s t a b -> IndexedTraversal i s t a b
77 | iordinal l = itraversal func
79 | func : Applicative f => (i -> a -> f b) -> s -> f t
80 | func = indexing $
applyStar . l . MkStar {f = Indexing i f}
85 | traversed : Traversable t => Traversal (t a) (t b) a b
86 | traversed @{_} @{MkIsTraversal _} = traverse'
90 | itraversed : Num i => Traversable t => IndexedTraversal i (t a) (t b) a b
91 | itraversed = iordinal traversed
95 | both : Bitraversable t => Traversal (t a a) (t b b) a b
96 | both = traversal (\f => bitraverse f f)
101 | backwards : Traversal s t a b -> Traversal s t a b
102 | backwards l = traversal func
104 | func : Applicative f => (a -> f b) -> s -> f t
105 | func fn = forwards . applyStar {f = Backwards f} (l $
MkStar (MkBackwards . fn))
111 | traverseOf : Applicative f => Traversal s t a b -> (a -> f b) -> s -> f t
112 | traverseOf l = applyStar . l . MkStar {f}
117 | itraverseOf : Applicative f => IndexedTraversal i s t a b -> (i -> a -> f b) -> s -> f t
118 | itraverseOf l = traverseOf (l @{%search} @{Idxed}) . uncurry
122 | forOf : Applicative f => Traversal s t a b -> s -> (a -> f b) -> f t
123 | forOf = flip . traverseOf
127 | iforOf : Applicative f => IndexedTraversal i s t a b -> s -> (i -> a -> f b) -> f t
128 | iforOf = flip . itraverseOf
132 | sequenceOf : Applicative f => Traversal s t (f a) a -> s -> f t
133 | sequenceOf l = traverseOf l id
139 | mapAccumLOf : Traversal s t a b -> (acc -> a -> (acc, b)) -> acc -> s -> (acc, t)
140 | mapAccumLOf l f z =
141 | let g = state . flip f
142 | in runState z . traverseOf l g
148 | mapAccumROf : Traversal s t a b -> (acc -> a -> (acc, b)) -> acc -> s -> (acc, t)
149 | mapAccumROf l f z =
150 | let g = MkBackwards {f=State acc} . state . flip f
151 | in runState z . forwards . traverseOf l g
156 | scanl1Of : Traversal s t a a -> (a -> a -> a) -> s -> t
158 | let step : Maybe a -> a -> (Maybe a, a)
159 | step Nothing x = (Just x, x)
160 | step (Just s) x = let r = f s x in (Just r, r)
161 | in snd . mapAccumLOf l step Nothing
166 | scanr1Of : Traversal s t a a -> (a -> a -> a) -> s -> t
168 | let step : Maybe a -> a -> (Maybe a, a)
169 | step Nothing x = (Just x, x)
170 | step (Just s) x = let r = f s x in (Just r, r)
171 | in snd . mapAccumROf l step Nothing
176 | failover : Alternative f => Traversal s t a b -> (a -> b) -> s -> f t
178 | let _ = Bool.Monoid.Any
179 | (b, y) = traverseOf l ((True,) . f) x
184 | ifailover : Alternative f => IndexedTraversal i s t a b -> (i -> a -> b) -> s -> f t
185 | ifailover l = failover (l @{%search} @{Idxed}) . uncurry
188 | partsOf_update : a -> State (List a) a
189 | partsOf_update x = get >>= \case
190 | x' :: xs' => put xs' $> x'
199 | partsOf : Traversal s t a a -> Lens s t (List a) (List a)
200 | partsOf l = lens (runForget $
l $
MkForget pure)
201 | (flip evalState . traverseOf l partsOf_update)
210 | ipartsOf : IndexedTraversal i s t a a -> IndexedLens (List i) s t (List a) (List a)
211 | ipartsOf l = ilens (unzip . (runForget $
l @{%search} @{Idxed} $
MkForget pure))
212 | (flip evalState . itraverseOf l (const partsOf_update))
219 | singular : Traversal' s a -> Optional' s a
220 | singular l = optional' (runForget $
l (MkForget Just)) set
223 | set str x = evalState True $
traverseOf l
224 | (\y => if !get then put False $> x else pure y) str
231 | isingular : IndexedTraversal' i s a -> IndexedOptional' i s a
232 | isingular l = ioptional' (runForget $
l @{%search} @{Idxed} (MkForget Just)) set
235 | set str x = evalState True $
itraverseOf l
236 | (\_,y => if !get then put False $> x else pure y) str
240 | elementsOf : Traversal s t a a -> (Nat -> Bool) -> Traversal s t a a
241 | elementsOf l p = traversal func
243 | func : Applicative f => (a -> f a) -> s -> f t
244 | func fn = indexing {f} (traverseOf l) $
245 | \i,x => if p i then fn x else pure {f} x
250 | elements : Traversable t => (Nat -> Bool) -> Traversal' (t a) a
251 | elements = elementsOf traversed
255 | elementOf : Traversal' s a -> Nat -> Optional' s a
256 | elementOf l n = singular $
elementsOf l (n ==)
261 | element : Traversable t => Nat -> Optional' (t a) a
262 | element = elementOf traversed
267 | taking : Nat -> Traversal s t a a -> Traversal s t a a
268 | taking n l = elementsOf l (< n)
272 | dropping : Nat -> Traversal s t a a -> Traversal s t a a
273 | dropping n l = elementsOf l (>= n)