0 | module Control.Lens.Getter
2 | import Data.Bicontravariant
3 | import Data.Profunctor
4 | import Data.Profunctor.Costrong
5 | import Control.Lens.Optic
6 | import Control.Lens.Indexed
7 | import Control.Lens.Lens
18 | record IsGetter p where
19 | constructor MkIsGetter
20 | runIsGetter : (Strong p, Bicontravariant p)
23 | getterToLens : IsGetter p => IsLens p
24 | getterToLens @{MkIsGetter _} = MkIsLens %search
27 | indexedGetter : IsGetter p => IsGetter (Indexed i p)
28 | indexedGetter @{MkIsGetter _} = MkIsGetter %search
35 | 0 Getter : (s,a : Type) -> Type
36 | Getter = Simple (Optic IsGetter)
40 | 0 IndexedGetter : (i,s,a : Type) -> Type
41 | IndexedGetter = Simple . IndexedOptic IsGetter
51 | to : (s -> a) -> Getter s a
52 | to f @{MkIsGetter _} = lmap f . rphantom
56 | ito : (s -> (i, a)) -> IndexedGetter i s a
57 | ito f @{MkIsGetter _} @{ind} = lmap f . rphantom . indexed @{ind}
61 | like : a -> Getter s a
67 | views : Getter s a -> (a -> r) -> s -> r
68 | views l = runForget . l . MkForget
72 | view : Getter s a -> s -> a
78 | iviews : IndexedGetter i s a -> (i -> a -> r) -> s -> r
79 | iviews l = runForget . l @{%search} @{Idxed} . MkForget . uncurry
83 | iview : IndexedGetter i s a -> s -> (i, a)
84 | iview l = runForget $
l @{%search} @{Idxed} $
MkForget id
87 | export infixl 8 ^.
, ^@.
93 | (^.) : s -> Getter s a -> a
100 | (^@.) : s -> IndexedGetter i s a -> (i, a)
101 | (^@.) x l = iview l x