Add lenses for List1
This commit is contained in:
parent
aabe5a94d0
commit
40fd0a3a3b
51
src/Data/List1/Lens.idr
Normal file
51
src/Data/List1/Lens.idr
Normal file
|
@ -0,0 +1,51 @@
|
||||||
|
module Data.List1.Lens
|
||||||
|
|
||||||
|
import Data.List1
|
||||||
|
import Data.Profunctor
|
||||||
|
import public Control.Lens
|
||||||
|
import Data.Tuple.Lens
|
||||||
|
|
||||||
|
%default total
|
||||||
|
|
||||||
|
||| An isomorphism between a list and its reverse.
|
||||||
|
public export
|
||||||
|
reversed : Iso (List1 a) (List1 b) (List1 a) (List1 b)
|
||||||
|
reversed = iso reverse reverse
|
||||||
|
|
||||||
|
|
||||||
|
public export
|
||||||
|
cons_ : Iso (List1 a) (List1 b) (a, List a) (b, List b)
|
||||||
|
cons_ = iso (\(x:::xs) => (x,xs)) (uncurry (:::))
|
||||||
|
|
||||||
|
public export
|
||||||
|
head_ : Lens' (List1 a) a
|
||||||
|
head_ = cons_ . fst_
|
||||||
|
|
||||||
|
public export
|
||||||
|
tail_ : Lens' (List1 a) (List a)
|
||||||
|
tail_ = cons_ . snd_
|
||||||
|
|
||||||
|
public export
|
||||||
|
snoc_ : Iso (List1 a) (List1 b) (List a, a) (List b, b)
|
||||||
|
snoc_ = iso unsnoc (uncurry lappend . mapSnd singleton)
|
||||||
|
|
||||||
|
public export
|
||||||
|
init_ : Lens' (List1 a) (List a)
|
||||||
|
init_ = snoc_ . fst_
|
||||||
|
|
||||||
|
public export
|
||||||
|
last_ : Lens' (List1 a) a
|
||||||
|
last_ = snoc_ . snd_
|
||||||
|
|
||||||
|
|
||||||
|
public export
|
||||||
|
Ixed Nat a (List1 a) where
|
||||||
|
ix = element
|
||||||
|
|
||||||
|
public export
|
||||||
|
Each (List1 a) (List1 b) a b where
|
||||||
|
each = traversed
|
||||||
|
|
||||||
|
public export
|
||||||
|
Num i => IEach i (List1 a) (List1 b) a b where
|
||||||
|
ieach = itraversed
|
Loading…
Reference in a new issue