Add optics for common types
This commit is contained in:
parent
5fdd7192b1
commit
783a1efe5e
|
@ -1,5 +1,6 @@
|
||||||
module Control.Lens
|
module Control.Lens
|
||||||
|
|
||||||
|
import public Control.Lens.At
|
||||||
import public Control.Lens.Equality
|
import public Control.Lens.Equality
|
||||||
import public Control.Lens.Fold
|
import public Control.Lens.Fold
|
||||||
import public Control.Lens.Getter
|
import public Control.Lens.Getter
|
||||||
|
|
36
src/Control/Lens/At.idr
Normal file
36
src/Control/Lens/At.idr
Normal file
|
@ -0,0 +1,36 @@
|
||||||
|
module Control.Lens.At
|
||||||
|
|
||||||
|
import Control.Lens.Optic
|
||||||
|
import Control.Lens.Lens
|
||||||
|
import Control.Lens.Optional
|
||||||
|
import Control.Lens.Traversal
|
||||||
|
import Control.Lens.Setter
|
||||||
|
|
||||||
|
%default total
|
||||||
|
|
||||||
|
|
||||||
|
public export
|
||||||
|
interface Ixed i v a | a where
|
||||||
|
ix : i -> Optional' a v
|
||||||
|
|
||||||
|
public export
|
||||||
|
[Function] Eq e => Ixed e a (e -> a) where
|
||||||
|
ix k = optional' (Just . ($ k)) (\f,x,k' => if k == k' then x else f k')
|
||||||
|
|
||||||
|
|
||||||
|
public export
|
||||||
|
interface Ixed i v a => Ixed' i i' v a | a where
|
||||||
|
ix' : i' -> Lens' a v
|
||||||
|
|
||||||
|
public export
|
||||||
|
[Function'] Eq e => Ixed' e e a (e -> a) using Function where
|
||||||
|
ix' k = lens ($ k) (\f,x,k' => if k == k' then x else f k')
|
||||||
|
|
||||||
|
|
||||||
|
public export
|
||||||
|
interface Ixed i v a => At i v a | a where
|
||||||
|
at : i -> Lens' a (Maybe v)
|
||||||
|
|
||||||
|
public export
|
||||||
|
sans : At i v a => i -> a -> a
|
||||||
|
sans k = at k .~ Nothing
|
16
src/Data/Either/Lens.idr
Normal file
16
src/Data/Either/Lens.idr
Normal file
|
@ -0,0 +1,16 @@
|
||||||
|
module Data.Either.Lens
|
||||||
|
|
||||||
|
import Data.Profunctor
|
||||||
|
import public Control.Lens
|
||||||
|
|
||||||
|
%default total
|
||||||
|
|
||||||
|
|
||||||
|
public export
|
||||||
|
Left_ : Prism (Either a c) (Either b c) a b
|
||||||
|
Left_ @{MkIsPrism _} = left
|
||||||
|
|
||||||
|
public export
|
||||||
|
Right_ : Prism (Either c a) (Either c b) a b
|
||||||
|
Right_ @{MkIsPrism _} = right
|
||||||
|
|
50
src/Data/List/Lens.idr
Normal file
50
src/Data/List/Lens.idr
Normal file
|
@ -0,0 +1,50 @@
|
||||||
|
module Data.List.Lens
|
||||||
|
|
||||||
|
import Data.List
|
||||||
|
import Data.Profunctor
|
||||||
|
import public Control.Lens
|
||||||
|
|
||||||
|
%default total
|
||||||
|
|
||||||
|
|
||||||
|
stripPrefix : Eq a => List a -> List a -> Maybe (List a)
|
||||||
|
stripPrefix [] ys = Just ys
|
||||||
|
stripPrefix (_ :: _) [] = Nothing
|
||||||
|
stripPrefix (x :: xs) (y :: ys) = guard (x == y) *> stripPrefix xs ys
|
||||||
|
|
||||||
|
stripSuffix : Eq a => List a -> List a -> Maybe (List a)
|
||||||
|
stripSuffix qs xs0 = go xs0 zs
|
||||||
|
where
|
||||||
|
drp : List a -> List a -> List a
|
||||||
|
drp (_::ps) (_::xs) = drp ps xs
|
||||||
|
drp [] xs = xs
|
||||||
|
drp _ [] = []
|
||||||
|
|
||||||
|
zs : List a
|
||||||
|
zs = drp qs xs0
|
||||||
|
|
||||||
|
go : List a -> List a -> Maybe (List a)
|
||||||
|
go (_::xs) (_::ys) = go xs ys
|
||||||
|
go xs [] = zipWith const xs0 zs <$ guard (xs == qs)
|
||||||
|
go [] _ = Nothing
|
||||||
|
|
||||||
|
|
||||||
|
public export
|
||||||
|
prefixed : Eq a => List a -> Prism' (List a) (List a)
|
||||||
|
prefixed xs = prism' (xs ++) (stripPrefix xs)
|
||||||
|
|
||||||
|
public export
|
||||||
|
suffixed : Eq a => List a -> Prism' (List a) (List a)
|
||||||
|
suffixed xs = prism' (++ xs) (stripSuffix xs)
|
||||||
|
|
||||||
|
|
||||||
|
public export
|
||||||
|
reversed : Iso (List a) (List b) (List a) (List b)
|
||||||
|
reversed = iso reverse reverse
|
||||||
|
|
||||||
|
|
||||||
|
public export
|
||||||
|
Ixed Nat a (List a) where
|
||||||
|
ix n = optional' (getAt n) (\xs,x => case inBounds n xs of
|
||||||
|
Yes _ => replaceAt n x xs
|
||||||
|
No _ => xs)
|
24
src/Data/Maybe/Lens.idr
Normal file
24
src/Data/Maybe/Lens.idr
Normal file
|
@ -0,0 +1,24 @@
|
||||||
|
module Data.Maybe.Lens
|
||||||
|
|
||||||
|
import Data.Maybe
|
||||||
|
import Data.Profunctor
|
||||||
|
import public Control.Lens
|
||||||
|
|
||||||
|
%default total
|
||||||
|
|
||||||
|
|
||||||
|
public export
|
||||||
|
Nothing_ : Prism' (Maybe a) ()
|
||||||
|
Nothing_ = prism' (const Nothing) (guard . isNothing)
|
||||||
|
|
||||||
|
public export
|
||||||
|
Just_ : Prism (Maybe a) (Maybe b) a b
|
||||||
|
Just_ = prism Just $ \case
|
||||||
|
Nothing => Left Nothing
|
||||||
|
Just x => Right x
|
||||||
|
|
||||||
|
infixl 9 .?
|
||||||
|
|
||||||
|
public export
|
||||||
|
(.?) : IsPrism p => Optic' p s t (Maybe a) (Maybe b) -> Optic' p a b a' b' -> Optic' p s t a' b'
|
||||||
|
l .? l' = l . Just_ . l'
|
16
src/Data/Tuple/Lens.idr
Normal file
16
src/Data/Tuple/Lens.idr
Normal file
|
@ -0,0 +1,16 @@
|
||||||
|
module Data.Tuple.Lens
|
||||||
|
|
||||||
|
import Data.Vect
|
||||||
|
import Data.Profunctor
|
||||||
|
import public Control.Lens
|
||||||
|
|
||||||
|
%default total
|
||||||
|
|
||||||
|
|
||||||
|
public export
|
||||||
|
fst_ : Lens (a, c) (b, c) a b
|
||||||
|
fst_ @{MkIsLens _} = first
|
||||||
|
|
||||||
|
public export
|
||||||
|
snd_ : Lens (c, a) (c, b) a b
|
||||||
|
snd_ @{MkIsLens _} = second
|
31
src/Data/Vect/Lens.idr
Normal file
31
src/Data/Vect/Lens.idr
Normal file
|
@ -0,0 +1,31 @@
|
||||||
|
module Data.Vect.Lens
|
||||||
|
|
||||||
|
import Data.Vect
|
||||||
|
import Control.Lens
|
||||||
|
|
||||||
|
%default total
|
||||||
|
|
||||||
|
|
||||||
|
public export
|
||||||
|
reversed : Iso (Vect n a) (Vect n b) (Vect n a) (Vect n b)
|
||||||
|
reversed = iso reverse reverse
|
||||||
|
|
||||||
|
|
||||||
|
public export
|
||||||
|
Ixed Nat a (Vect n a) where
|
||||||
|
ix n = optional' (ixMaybe n) (set n)
|
||||||
|
where
|
||||||
|
ixMaybe : forall n. Nat -> Vect n a -> Maybe a
|
||||||
|
ixMaybe _ [] = Nothing
|
||||||
|
ixMaybe Z (x :: _) = Just x
|
||||||
|
ixMaybe (S n) (_ :: xs) = ixMaybe n xs
|
||||||
|
|
||||||
|
set : forall n. Nat -> Vect n a -> a -> Vect n a
|
||||||
|
set _ [] _ = []
|
||||||
|
set Z (_ :: xs) y = y :: xs
|
||||||
|
set (S n) (x :: xs) y = x :: set n xs y
|
||||||
|
|
||||||
|
|
||||||
|
public export
|
||||||
|
Ixed' Nat (Fin n) a (Vect n a) where
|
||||||
|
ix' n = lens (index n) (flip $ replaceAt n)
|
Loading…
Reference in a new issue