0 | module Control.Lens.Setter
2 | import Data.Contravariant
3 | import Data.Profunctor
4 | import Data.Profunctor.Costrong
5 | import Data.Profunctor.Traversing
6 | import Data.Profunctor.Mapping
7 | import Control.Monad.State
8 | import Control.Lens.Optic
9 | import Control.Lens.Indexed
10 | import Control.Lens.Traversal
21 | record IsSetter p where
22 | constructor MkIsSetter
23 | runIsSetter : Mapping p
26 | setterToTraversal : IsSetter p => IsTraversal p
27 | setterToTraversal @{MkIsSetter _} = MkIsTraversal %search
30 | indexedSetter : IsSetter p => IsSetter (Indexed i p)
31 | indexedSetter @{MkIsSetter _} = MkIsSetter %search
43 | 0 Setter : (s,t,a,b : Type) -> Type
44 | Setter = Optic IsSetter
48 | 0 Setter' : (s,a : Type) -> Type
49 | Setter' = Simple Setter
53 | 0 IndexedSetter : (i,s,t,a,b : Type) -> Type
54 | IndexedSetter = IndexedOptic IsSetter
58 | 0 IndexedSetter' : (i,s,a : Type) -> Type
59 | IndexedSetter' = Simple . IndexedSetter
69 | sets : ((a -> b) -> s -> t) -> Setter s t a b
70 | sets f @{MkIsSetter _} = roam f
74 | isets : ((i -> a -> b) -> s -> t) -> IndexedSetter i s t a b
75 | isets f @{MkIsSetter _} @{ind} = roam (f . curry) . indexed @{ind}
79 | mapped : Functor f => Setter (f a) (f b) a b
80 | mapped @{_} @{MkIsSetter _} = map'
84 | contramapped : Contravariant f => Setter (f a) (f b) b a
85 | contramapped = sets contramap
90 | over : Setter s t a b -> (a -> b) -> s -> t
91 | over l = l @{MkIsSetter Function}
93 | export infixr 4 %~
, %@~
, .~
, .@~
99 | (%~) : Setter s t a b -> (a -> b) -> s -> t
105 | iover : IndexedSetter i s t a b -> (i -> a -> b) -> s -> t
106 | iover l = l @{MkIsSetter Function} @{Idxed} . uncurry
112 | (%@~) : IndexedSetter i s t a b -> (i -> a -> b) -> s -> t
118 | set : Setter s t a b -> b -> s -> t
119 | set l = over l . const
125 | (.~) : Setter s t a b -> b -> s -> t
131 | iset : IndexedSetter i s t a b -> (i -> b) -> s -> t
132 | iset l = iover l . (const .)
138 | (.@~) : IndexedSetter i s t a b -> (i -> b) -> s -> t
146 | export infixr 4 ?~
, <.~
, <?~
, +~
, *~
, -~
, /~
, ||~
, &&~
, <+>~
147 | export infix 4 %=
, %@=
, .=
, .@=
, ?=
, <.=
, <?=
, +=
, *=
, -=
, //=
, ||=
, &&=
, <+>=
148 | export infix 1 <~
, <<~
152 | (?~) : Setter s t a (Maybe b) -> b -> s -> t
153 | (?~) l = set l . Just
157 | (<.~) : Setter s t a b -> b -> s -> (b, t)
158 | (<.~) l x = (x,) . set l x
162 | (<?~) : Setter s t a (Maybe b) -> b -> s -> (b, t)
163 | (<?~) l x = (x,) . (?~) l x
168 | (+~) : Num a => Setter s t a a -> a -> s -> t
169 | (+~) l = over l . (+)
173 | (*~) : Num a => Setter s t a a -> a -> s -> t
174 | (*~) l = over l . (*)
178 | (-~) : Neg a => Setter s t a a -> a -> s -> t
179 | (-~) l = over l . flip (-)
183 | (/~) : Fractional a => Setter s t a a -> a -> s -> t
184 | (/~) l = over l . flip (/)
190 | (||~) : Setter s t Bool Bool -> Lazy Bool -> s -> t
191 | (||~) l = over l . flip (||)
197 | (&&~) : Setter s t Bool Bool -> Lazy Bool -> s -> t
198 | (&&~) l = over l . flip (&&)
207 | (<+>~) : Semigroup a => Setter s t a a -> a -> s -> t
208 | (<+>~) l = over l . flip (<+>)
213 | (%=) : MonadState s m => Setter s s a b -> (a -> b) -> m ()
214 | (%=) = modify .: over
218 | (%@=) : MonadState s m => IndexedSetter i s s a b -> (i -> a -> b) -> m ()
219 | (%@=) = modify .: iover
223 | (.=) : MonadState s m => Setter s s a b -> b -> m ()
224 | (.=) = modify .: set
228 | (.@=) : MonadState s m => IndexedSetter i s s a b -> (i -> b) -> m ()
229 | (.@=) = modify .: iset
233 | (?=) : MonadState s m => Setter s s a (Maybe b) -> b -> m ()
234 | (?=) = modify .: (?~)
238 | (<.=) : MonadState s m => Setter s s a b -> b -> m b
239 | (<.=) l x = (l .= x) $> x
243 | (<?=) : MonadState s m => Setter s s a (Maybe b) -> b -> m b
244 | (<?=) l x = (l ?= x) $> x
248 | (+=) : Num a => MonadState s m => Setter' s a -> a -> m ()
249 | (+=) = modify .: (+~)
253 | (*=) : Num a => MonadState s m => Setter' s a -> a -> m ()
254 | (*=) = modify .: (*~)
258 | (-=) : Neg a => MonadState s m => Setter' s a -> a -> m ()
259 | (-=) = modify .: (-~)
263 | (//=) : Fractional a => MonadState s m => Setter' s a -> a -> m ()
264 | (//=) = modify .: (/~)
270 | (||=) : MonadState s m => Setter' s Bool -> Lazy Bool -> m ()
271 | (||=) = modify .: (||~)
277 | (&&=) : MonadState s m => Setter' s Bool -> Lazy Bool -> m ()
278 | (&&=) = modify .: (&&~)
284 | (<+>=) : Semigroup a => MonadState s m => Setter' s a -> a -> m ()
285 | (<+>=) = modify .: (<+>~)
294 | (<~) : MonadState s m => Setter s s a b -> m b -> m ()
301 | (<<~) : MonadState s m => Setter s s a b -> m b -> m b
302 | (<<~) l m = l <.= !m