0 | module Control.Lens.Cons
2 | import Data.Profunctor
3 | import Control.Lens.Optic
4 | import Control.Lens.Iso
5 | import Control.Lens.Prism
6 | import Control.Lens.Review
7 | import Control.Lens.Optional
15 | interface Cons s t a b | s where
17 | consIso : Iso s t (Maybe (a, s)) (Maybe (b, t))
21 | cons_ : Prism s t (a, s) (b, t)
22 | cons_ = consIso . prism Just (\case
23 | Nothing => Left Nothing
28 | head_ : Cons s s a a => Optional' s a
29 | head_ @{_} @{MkIsOptional _} = cons_ . first
34 | tail_ : Cons s s a a => Optional' s s
35 | tail_ @{_} @{MkIsOptional _} = cons_ . second
39 | nil : Cons s s a a => s
40 | nil = review consIso Nothing
46 | interface Snoc s t a b | s where
48 | snocIso : Iso s t (Maybe (s, a)) (Maybe (t, b))
52 | snoc_ : Prism s t (s, a) (t, b)
53 | snoc_ = snocIso . prism Just (\case
54 | Nothing => Left Nothing
59 | init_ : Snoc s s a a => Optional' s s
60 | init_ @{_} @{MkIsOptional _} = snoc_ . first
64 | last_ : Snoc s s a a => Optional' s a
65 | last_ @{_} @{MkIsOptional _} = snoc_ . second
69 | lin : Snoc s s a a => s
70 | lin = review snocIso Nothing