0 | module Data.List.Lens
3 | import Data.Profunctor
4 | import public Control.Lens
9 | stripPrefix : Eq a => List a -> List a -> Maybe (List a)
10 | stripPrefix [] ys = Just ys
11 | stripPrefix (_ :: _) [] = Nothing
12 | stripPrefix (x :: xs) (y :: ys) = guard (x == y) *> stripPrefix xs ys
14 | stripSuffix : Eq a => List a -> List a -> Maybe (List a)
15 | stripSuffix qs xs0 = go xs0 zs
17 | drp : List a -> List a -> List a
18 | drp (_::ps) (_::xs) = drp ps xs
25 | go : List a -> List a -> Maybe (List a)
26 | go (_::xs) (_::ys) = go xs ys
27 | go xs [] = zipWith const xs0 zs <$ guard (xs == qs)
33 | prefixed : Eq a => List a -> Prism' (List a) (List a)
34 | prefixed xs = prism' (xs ++) (stripPrefix xs)
38 | suffixed : Eq a => List a -> Prism' (List a) (List a)
39 | suffixed xs = prism' (++ xs) (stripSuffix xs)
44 | reversed : Iso (List a) (List b) (List a) (List b)
45 | reversed = iso reverse reverse
49 | Ixed Nat a (List a) where
53 | Cons (List a) (List b) a b where
54 | consIso = iso (\case
56 | x :: xs => Just (x,xs))
57 | (maybe [] $
uncurry (::))
59 | cons_ = prism (uncurry (::)) (\case
61 | x :: xs => Right (x, xs))
63 | unsnoc : a -> List a -> (List a, a)
64 | unsnoc x [] = ([], x)
65 | unsnoc x (y :: xs) = mapFst (x ::) $
unsnoc y xs
68 | Snoc (List a) (List b) a b where
69 | snocIso = iso (\case
71 | x :: xs => Just $
unsnoc x xs)
72 | (maybe [] $
uncurry snoc)
74 | snoc_ = prism (uncurry snoc) (\case
76 | x :: xs => Right $
unsnoc x xs)
79 | Each (List a) (List b) a b where
83 | Num i => IEach i (List a) (List b) a b where