0 | module Control.Lens.Lens
2 | import Data.Profunctor
3 | import Data.Profunctor.Yoneda
4 | import Control.Monad.State
5 | import Control.Lens.Optic
6 | import Control.Lens.Indexed
7 | import Control.Lens.Equality
8 | import Control.Lens.Iso
19 | record IsLens p where
20 | constructor MkIsLens
21 | runIsLens : Strong p
24 | lensToIso : IsLens p => IsIso p
25 | lensToIso @{MkIsLens _} = MkIsIso %search
28 | indexedLens : IsLens p => IsLens (Indexed i p)
29 | indexedLens @{MkIsLens _} = MkIsLens %search
47 | 0 Lens : (s,t,a,b : Type) -> Type
52 | 0 Lens' : (s,a : Type) -> Type
61 | 0 IndexedLens : (i,s,t,a,b : Type) -> Type
62 | IndexedLens = IndexedOptic IsLens
66 | 0 IndexedLens' : (i,s,a : Type) -> Type
67 | IndexedLens' = Simple . IndexedLens
81 | lens : (get : s -> a) -> (set : s -> b -> t) -> Lens s t a b
82 | lens get set @{MkIsLens _} = dimap (\x => (x, get x)) (uncurry set) . second
86 | ilens : (get : s -> (i, a)) -> (set : s -> b -> t) -> IndexedLens i s t a b
87 | ilens get set @{_} @{ind} = lens get set . indexed @{ind}
92 | getLens : Lens s t a b -> (s -> a, s -> b -> t)
93 | getLens l = l @{MkIsLens strong} (id, const id)
95 | Profunctor (\x,y => (x -> a, x -> b -> y)) where
96 | dimap f g (get, set) = (get . f, (g .) . set . f)
98 | [strong] GenStrong Pair (\x,y => (x -> a, x -> b -> y)) where
99 | strongl (get, set) = (get . fst, \(a,c),b => (set a b, c))
100 | strongr (get, set) = (get . snd, \(c,a),b => (c, set a b))
104 | withLens : Lens s t a b -> ((s -> a) -> (s -> b -> t) -> r) -> r
105 | withLens l f = uncurry f (getLens l)
110 | devoid : IndexedLens i Void t a b
111 | devoid = ilens absurd absurd
115 | united : Lens' a ()
116 | united @{MkIsLens _} = dimap ((),) snd . first
120 | alongside : Lens s t a b -> Lens s' t' a' b' -> Lens (s, s') (t, t') (a, a') (b, b')
122 | let (get1, set1) = getLens l
123 | (get2, set2) = getLens l'
124 | in lens (bimap get1 get2) (uncurry bimap . bimap set1 set2)
133 | fusing : IsIso p => Optic' (Yoneda p) s t a b -> Optic' p s t a b
134 | fusing @{MkIsIso _} l = proextract . l . propure
141 | export infixr 4 %%~
, %%=
, %%@~
, %%@=
143 | export infixr 4 <%~
, <%@~
, <+~
, <*~
, <-~
, </~
, <||~
, <&&~
, <<+>~
144 | export infixr 4 <<%~
, <<%@~
, <<.~
, <<?~
, <<+~
, <<*~
, <<-~
, <</~
, <<||~
, <<&&~
, <<<+>~
146 | export infix 4 <%=
, <%@=
, <+=
, <*=
, <-=
, </=
, <||=
, <&&=
, <<+>=
147 | export infix 4 <<%=
, <<%@=
, <<.=
, <<?=
, <<+=
, <<*=
, <<-=
, <</=
, <<||=
, <<&&=
, <<<+>=
149 | export infixr 1 <<<~
153 | (%%~) : Functor f => Lens s t a b -> (a -> f b) -> s -> f t
154 | (%%~) l = applyStar . l . MkStar {f}
157 | (%%=) : MonadState s m => Lens s s a b -> (a -> (r, b)) -> m r
158 | (%%=) = (state . (swap .)) .: (%%~)
161 | (%%@~) : Functor f => IndexedLens i s t a b -> (i -> a -> f b) -> s -> f t
162 | (%%@~) l = applyStar . l {p=Star f} @{%search} @{Idxed}
166 | (%%@=) : MonadState s m => IndexedLens i s s a b -> (i -> a -> (r, b)) -> m r
167 | (%%@=) = (state . (swap .)) .: (%%@~)
172 | (<%~) : Lens s t a b -> (a -> b) -> s -> (b, t)
173 | (<%~) l f = l %%~ (\x => (x,x)) . f
177 | (<%@~) : IndexedLens i s t a b -> (i -> a -> b) -> s -> (b, t)
178 | (<%@~) l f = l %%@~ (\x => (x,x)) .: f
182 | (<+~) : Num a => Lens s t a a -> a -> s -> (a, t)
183 | (<+~) l = (<%~) l . (+)
187 | (<*~) : Num a => Lens s t a a -> a -> s -> (a, t)
188 | (<*~) l = (<%~) l . (*)
192 | (<-~) : Neg a => Lens s t a a -> a -> s -> (a, t)
193 | (<-~) l = (<%~) l . flip (-)
197 | (</~) : Fractional a => Lens s t a a -> a -> s -> (a, t)
198 | (</~) l = (<%~) l . flip (/)
204 | (<||~) : Lens s t Bool Bool -> Lazy Bool -> s -> (Bool, t)
205 | (<||~) l = (<%~) l . flip (||)
211 | (<&&~) : Lens s t Bool Bool -> Lazy Bool -> s -> (Bool, t)
212 | (<&&~) l = (<%~) l . flip (&&)
221 | (<<+>~) : Semigroup a => Lens s t a a -> a -> s -> (a, t)
222 | (<<+>~) l = (<%~) l . flip (<+>)
227 | (<<%~) : Lens s t a b -> (a -> b) -> s -> (a, t)
228 | (<<%~) l f = l %%~ (\x => (x, f x))
231 | (<<%@~) : IndexedLens i s t a b -> (i -> a -> b) -> s -> (a, t)
232 | (<<%@~) l f = l %%@~ (\i,x => (x, f i x))
236 | (<<.~) : Lens s t a b -> b -> s -> (a, t)
237 | (<<.~) l x = l %%~ (,x)
241 | (<<?~) : Lens s t a (Maybe b) -> b -> s -> (a, t)
242 | (<<?~) l = (<<.~) l . Just
246 | (<<+~) : Num a => Lens s t a a -> a -> s -> (a, t)
247 | (<<+~) l = (<<%~) l . (+)
251 | (<<*~) : Num a => Lens s t a a -> a -> s -> (a, t)
252 | (<<*~) l = (<<%~) l . (*)
256 | (<<-~) : Neg a => Lens s t a a -> a -> s -> (a, t)
257 | (<<-~) l = (<%~) l . flip (-)
261 | (<</~) : Fractional a => Lens s t a a -> a -> s -> (a, t)
262 | (<</~) l = (<<%~) l . flip (/)
268 | (<<||~) : Lens s t Bool Bool -> Lazy Bool -> s -> (Bool, t)
269 | (<<||~) l = (<<%~) l . flip (||)
275 | (<<&&~) : Lens s t Bool Bool -> Lazy Bool -> s -> (Bool, t)
276 | (<<&&~) l = (<<%~) l . flip (&&)
286 | (<<<+>~) : Semigroup a => Lens s t a a -> a -> s -> (a, t)
287 | (<<<+>~) l = (<<%~) l . flip (<+>)
292 | (<%=) : MonadState s m => Lens s s a b -> (a -> b) -> m b
293 | (<%=) = (state . (swap .)) .: (<%~)
297 | (<%@=) : MonadState s m => IndexedLens i s s a b -> (i -> a -> b) -> m b
298 | (<%@=) = (state . (swap .)) .: (<%@~)
302 | (<+=) : Num a => MonadState s m => Lens' s a -> a -> m a
303 | (<+=) = (state . (swap .)) .: (<+~)
307 | (<*=) : Num a => MonadState s m => Lens' s a -> a -> m a
308 | (<*=) = (state . (swap .)) .: (<*~)
312 | (<-=) : Neg a => MonadState s m => Lens' s a -> a -> m a
313 | (<-=) = (state . (swap .)) .: (<-~)
317 | (</=) : Fractional a => MonadState s m => Lens' s a -> a -> m a
318 | (</=) = (state . (swap .)) .: (</~)
322 | (<||=) : MonadState s m => Lens s s Bool Bool -> Lazy Bool -> m Bool
323 | (<||=) = (state . (swap .)) .: (<||~)
327 | (<&&=) : MonadState s m => Lens s s Bool Bool -> Lazy Bool -> m Bool
328 | (<&&=) = (state . (swap .)) .: (<&&~)
332 | (<<+>=) : MonadState s m => Semigroup a => Lens' s a -> a -> m a
333 | (<<+>=) = (state . (swap .)) .: (<<+>~)
338 | (<<%=) : MonadState s m => Lens s s a b -> (a -> b) -> m a
339 | (<<%=) = (state . (swap .)) .: (<<%~)
343 | (<<%@=) : MonadState s m => IndexedLens i s s a b -> (i -> a -> b) -> m a
344 | (<<%@=) = (state . (swap .)) .: (<<%@~)
348 | (<<.=) : MonadState s m => Lens s s a b -> b -> m a
349 | (<<.=) = (state . (swap .)) .: (<<.~)
353 | (<<?=) : MonadState s m => Lens s s a (Maybe b) -> b -> m a
354 | (<<?=) = (state . (swap .)) .: (<<?~)
358 | (<<+=) : Num a => MonadState s m => Lens' s a -> a -> m a
359 | (<<+=) = (state . (swap .)) .: (<<+~)
364 | (<<*=) : Num a => MonadState s m => Lens' s a -> a -> m a
365 | (<<*=) = (state . (swap .)) .: (<<*~)
369 | (<<-=) : Neg a => MonadState s m => Lens' s a -> a -> m a
370 | (<<-=) = (state . (swap .)) .: (<<-~)
375 | (<</=) : Fractional a => MonadState s m => Lens' s a -> a -> m a
376 | (<</=) = (state . (swap .)) .: (<</~)
381 | (<<||=) : MonadState s m => Lens s s Bool Bool -> Lazy Bool -> m Bool
382 | (<<||=) = (state . (swap .)) .: (<<||~)
387 | (<<&&=) : MonadState s m => Lens s s Bool Bool -> Lazy Bool -> m Bool
388 | (<<&&=) = (state . (swap .)) .: (<<&&~)
393 | (<<<+>=) : MonadState s m => Semigroup a => Lens' s a -> a -> m a
394 | (<<<+>=) = (state . (swap .)) .: (<<<+>~)
401 | (<<<~) : MonadState s m => Lens s s a b -> m b -> m a
402 | (<<<~) l m = l <<.= !m