19 | import Control.Monad.Identity
20 | import public Control.Monad.Reader
21 | import Data.Contravariant
22 | import public Data.List
23 | import public Data.List.Quantifiers
24 | import public Data.Nat
25 | import public Data.Vect
29 | Neq : Nat -> Nat -> Type
30 | Neq x y = Either (LT x y) (GT x y)
37 | range : (n : Nat) -> Vect n Nat
39 | range (S n) = snoc (range n) n
44 | enumerate : Vect n a -> Vect n (Nat, a)
46 | let lengthOK = lengthCorrect xs
47 | in rewrite sym lengthOK in zip (range (length xs)) (rewrite lengthOK in xs)
54 | range : (n : Nat) -> List Nat
55 | range n = toList (Vect.range n)
60 | enumerate : List a -> List (Nat, a)
61 | enumerate xs = toList (enumerate (fromList xs))
67 | unique : Eq a => List a -> Bool
69 | unique (x :: xs) = not (elem x xs) && unique xs
75 | , unique [0, 1] = True
76 | , unique [1, 0] = True
77 | , unique [0, 0] = False
78 | , unique [0, 0, 1] = False
79 | , unique [0, 1, 0] = False
80 | , unique [1, 0, 0] = False
81 | , unique [1, 1, 0] = False
82 | , unique [1, 0, 1] = False
83 | , unique [0, 1, 1] = False
84 | , unique [1, 2, 3] = True
91 | map : (f : (x : a) -> {0 ok : p x} -> b) -> (xs : List a) -> {auto 0 allOk : All p xs} -> List b
92 | map f [] {allOk = []} = []
93 | map f (x :: xs) {allOk = ok :: _} = f {ok} x :: map f xs
101 | multiIndex : (idxs : List Nat) ->
103 | {auto 0 inBounds : All (flip InBounds xs) idxs} ->
105 | multiIndex idxs xs = map f idxs
109 | f : (i : Nat) -> {0 _ : InBounds i xs} -> a
118 | deleteAt : (idxs : List Nat) ->
120 | {auto 0 inBounds : All (flip InBounds xs) idxs} ->
122 | deleteAt idxs xs = impl 0 xs
124 | impl : Nat -> List a -> List a
126 | impl i (x :: xs) = if elem i idxs then impl (S i) xs else x :: impl (S i) xs
131 | data All2 : (0 p : a -> b -> Type) -> List a -> List b -> Type where
133 | (::) : forall xs, ys . p x y -> All2 p xs ys -> All2 p (x :: xs) (y :: ys)
139 | data Sorted : (a -> a -> Type) -> List a -> Type where
144 | SOne : Sorted f [x]
147 | SCons : (y : a) -> f y x -> Sorted f (x :: xs) -> Sorted f (y :: x :: xs)
151 | inBoundsCons : (xs : List a) -> InBounds k xs -> InBounds k (x :: xs)
152 | inBoundsCons _ InFirst = InFirst
153 | inBoundsCons (_ :: ys) (InLater prf) = InLater (inBoundsCons ys prf)
157 | (>$<) : (env' -> env) -> ReaderT env m a -> ReaderT env' m a
158 | f >$< (MkReaderT g) = MkReaderT (g . f)