0 | module Libraries.Data.List.Extra
2 | import public Data.List
9 | elemAt : List a -> Nat -> Maybe a
10 | elemAt [] _ = Nothing
11 | elemAt (l :: _) Z = Just l
12 | elemAt (_ :: ls) (S n) = elemAt ls n
15 | findBy : (a -> Maybe b) -> List a -> Maybe b
16 | findBy p [] = Nothing
19 | Nothing => findBy p xs
20 | Just win => pure win
23 | findBy' : (a -> Bool) -> List a -> (List a, Maybe a, List a)
24 | findBy' f [] = ([], Nothing, [])
25 | findBy' f (x :: xs) =
27 | True => ([], Just x, xs)
29 | let (pre, mb, post) = findBy' f xs in
30 | (x :: pre, mb, post)
34 | findAndDeleteBy : (a -> Bool) -> List a -> Maybe (a, List a)
35 | findAndDeleteBy f xs
36 | = case findBy' f xs of
37 | (pre, Just x, post) => Just (x, pre ++ post)
43 | diffBy : (a -> a -> Bool)
48 | diffBy f (x :: xs) ys =
49 | let whole@(pre, mb, post) = findBy' (f x) ys
50 | ys' = pre ++ post in
52 | Just _ => diffBy f xs ys'
53 | Nothing => x :: diffBy f xs ys'
57 | dedup : Eq a => List a -> List a
58 | dedup (a :: xs@(b :: _)) = if a == b then dedup xs else a :: dedup xs
63 | sortedNub : Ord a => List a -> List a
64 | sortedNub = dedup . sort
67 | lengthDistributesOverAppend
69 | -> length (xs ++ ys) = length xs + length ys
70 | lengthDistributesOverAppend [] ys = Refl
71 | lengthDistributesOverAppend (x :: xs) ys =
72 | cong S $
lengthDistributesOverAppend xs ys