7 | import Data.Nat.Division
11 | import Data.Fin.Extra
12 | import Syntax.WithProof
16 | Eithers : List Type -> Type
18 | Eithers (x :: []) = x
19 | Eithers (x :: xs) = Either x (Eithers xs)
22 | kill_linear : Void -> (1 _ : a) -> s
23 | kill_linear x = void x
26 | pair_to_list : (a, a) -> List a
27 | pair_to_list (x1, x2) = [x1, x2]
30 | vect_to_pair : Vect 2 a -> (a, a)
31 | vect_to_pair [x1, x2] = (x1, x2)
34 | pair_to_vect : (a, a) -> Vect 2 a
35 | pair_to_vect (x1, x2) = [x1, x2]
38 | from_vect : Vect 1 a -> a
42 | to_vect : a -> Vect 1 a
47 | s_and : Bool -> Bool -> Bool
48 | s_and True False = False
49 | s_and True True = True
50 | s_and False False = False
51 | s_and False True = False
54 | mmod : Integer -> (m : Nat) -> {auto 0 ok : NonZero m} -> Nat
56 | let m' = natToInteger m
57 | in integerToNat ((m' + n `mod` m') `mod` m')
60 | mod': Integer -> Integer -> Integer
62 | mod' n m = (m + n `mod` m) `mod` m
65 | s_eq : (Bits b, Eq b) => Vect n b -> Vect n b -> Bool
66 | s_eq a b = (zeroBits ==) $
foldr (.|.) zeroBits $
zipWith xor a b
69 | s_eq' : (Bits b, Eq b) => List b -> List b -> Bool
70 | s_eq' a b = (length a == length b) `s_and` ((zeroBits ==) $
foldr (.|.) zeroBits $
zipWith xor a b)
73 | vect_zip_with : {n : Nat} -> {m : Nat} -> (a -> b -> c) -> Vect n a -> Vect m b -> Vect (minimum n m) c
74 | vect_zip_with {n=0} {m} f [] _ = []
75 | vect_zip_with {n} {m=0} f _ [] = rewrite minimumZeroZeroLeft n in []
76 | vect_zip_with f (x::xs) (y::ys) = f x y :: vect_zip_with f xs ys
79 | group : (n : Nat) -> (m : Nat) -> Vect (n * m) a -> Vect n (Vect m a)
81 | group (S n) m xs = let (l, r) = splitAt m xs in l :: group n m r
84 | chunk : Nat -> List a -> List (List a)
86 | chunk n xs = (take n xs) :: (chunk n (drop n xs))
90 | group' : (n : Nat) -> (m : Nat) -> Vect (n * m) a -> Vect m (Vect n a)
91 | group' n m xs = group m n $
rewrite multCommutative m n in xs
96 | split_at_concat_rev : (n : Nat) -> (xs : Vect (n + m) a) -> {0 l : Vect n a} -> {0 r : Vect m a} -> (0 _ : splitAt n xs = (l, r)) -> l ++ r = xs
97 | split_at_concat_rev Z _ Refl = Refl
98 | split_at_concat_rev (S n) (x :: xs) {l} prf with (splitAt n xs) proof sprf
99 | split_at_concat_rev (S n) (x :: xs) {l = x :: l} Refl | (l, _) = cong (x ::) $
split_at_concat_rev n xs sprf
103 | concat_group_id : (n : Nat) -> (m : Nat) -> (v : Vect (n * m) a) -> concat (group n m v) = v
104 | concat_group_id Z _ [] = Refl
105 | concat_group_id (S n) m xs with (splitAt m xs) proof prf
106 | _ | (l, r) = rewrite concat_group_id n m r in split_at_concat_rev m xs prf
108 | pow_mod' : Integer -> Integer -> Integer -> Integer -> Integer
112 | else let n' = (n * x) `mod` m
114 | x' = (x * x) `mod` m
115 | in pow_mod' (if testBit y 0 then n' else n) x' y' m
118 | pow_mod : Integer -> Integer -> Integer -> Integer
119 | pow_mod x y m = pow_mod' 1 (x `mod'` m) (y `mod'` m) m
121 | mul_mod' : Integer -> Integer -> Integer -> Integer -> Integer
125 | else let n' = (n + x) `mod` m
127 | x' = (x * 2) `mod` m
128 | in mul_mod' (if testBit y 0 then n' else n) x' y' m
131 | mul_mod : Integer -> Integer -> Integer -> Integer
132 | mul_mod x y m = mul_mod' 0 (x `mod'` m) (y `mod'` m) m
135 | quot_rem : Integer -> Integer -> (Integer, Integer)
137 | let dividend = if d < 0 then -(val `div` abs d) else val `div` d
138 | remainder = abs (val - dividend * d)
139 | in (dividend, remainder)
142 | gcd' : Integer -> Integer -> Integer
144 | gcd' a b = gcd' b (a `mod` b)
147 | are_coprimes : Integer -> Integer -> Bool
148 | are_coprimes x y = (gcd' x y) == 1
153 | extended_gcd : Integer -> Integer -> (Integer, Integer)
154 | extended_gcd a 0 = (1, 0)
156 | let (q, r) = quot_rem a b
157 | (s, t) = extended_gcd b r
162 | inv_mul_mod : Integer -> Integer -> Integer
164 | let (x, y) = extended_gcd a m
168 | forM : Applicative f => (n : Nat) -> (f b) -> f (Vect n b)
169 | forM n f = for (the (Vect n (Fin n)) range) (const f)
171 | utf8_bytelen : Bits8 -> Maybe (Bits8, Nat)
173 | if (x .&. 0b01111111) == x then Just (x, 0)
174 | else if (shiftR x 5) == 0b110 then Just (x .&. 0b0011111, 1)
175 | else if (shiftR x 4) == 0b1110 then Just (x .&. 0b0001111, 2)
176 | else if (shiftR x 3) == 0b11110 then Just (x .&. 0b0000111, 3)
179 | utf8_unmask : Bits8 -> Maybe Bits8
180 | utf8_unmask x = const (x .&. 0b00111111) <$> guard (shiftR x 6 == 0b10)
182 | utf8_pushbits : Integer -> List Bits8 -> Integer
183 | utf8_pushbits acc [] = acc
184 | utf8_pushbits acc (x::xs) = utf8_pushbits ((shiftL acc 6) .|. (cast x)) xs
187 | utf8_decode : List Bits8 -> Maybe String
188 | utf8_decode = go []
190 | go : List Char -> List Bits8 -> Maybe String
191 | go acc [] = Just $
pack $
reverse acc
192 | go acc (x :: xs) = do
193 | (x, l) <- utf8_bytelen x
194 | let (y,ys) = splitAt l xs
195 | guard (length y == l)
196 | y <- traverse utf8_unmask y
197 | let c = utf8_pushbits (cast x) y
198 | go ((cast c) :: acc) ys
201 | stream_concat : Foldable t => Stream (t a) -> Stream a
202 | stream_concat = go . map toList
204 | go : Stream (List a) -> Stream a
205 | go ([] :: ys) = stream_concat ys
206 | go ((x :: xs) :: ys) = x :: stream_concat (xs :: ys)
209 | ok_minus : (n : Nat) -> (m : Nat) -> LTE m n -> Nat
210 | ok_minus n Z LTEZero = n
211 | ok_minus (S n) (S m) (LTESucc wit) = ok_minus n m wit
215 | enumerate : Nat -> List a -> List (Nat, a)
216 | enumerate n [] = []
217 | enumerate n (x :: xs) = (n, x) :: enumerate (S n) xs
221 | replace_vect : (0 _ : n = m) -> Vect n a -> Vect m a
222 | replace_vect prf input = rewrite sym prf in input
225 | cycle : Vect (S n) a -> Stream a
228 | go : Vect i a -> Stream a
230 | go (z :: zs) = z :: go zs
234 | prepend : List a -> Stream a -> Stream a
236 | prepend (x :: xs) ys = x :: prepend xs ys
239 | duplicate : Stream a -> Stream (Stream a)
240 | duplicate (x :: xs) = (x :: xs) :: duplicate xs
243 | split : (n : Nat) -> Stream a -> (Vect n a, Stream a)
244 | split Z xs = ([], xs)
245 | split (S n) (v :: xs) = let (vs, xs') = split n xs in (v :: vs, xs')
248 | chunk : (n : Nat) -> Stream a -> Stream (Vect n a)
249 | chunk n xs = let (y, ys) = split n xs in y :: chunk n ys
252 | lte_plus_left : (a : _) -> LTE (a + b) c -> LTE b c
253 | lte_plus_left Z x = x
254 | lte_plus_left (S k) x = lte_plus_left k (lteSuccLeft x)
257 | maybe_to_either : Maybe a -> Lazy b -> Either b a
258 | maybe_to_either Nothing b = Left $
force b
259 | maybe_to_either (Just a) _ = Right a
262 | init' : List a -> List a
264 | init' (x :: xs) = init (x :: xs)
267 | uncons1 : List1 a -> (List a, a)
268 | uncons1 lst = (init lst, last lst)
271 | splitAt : (n : Nat) -> Stream a -> (Vect n a, Stream a)
272 | splitAt n s = (take n s, drop n s)
275 | zeros : {n : Nat} -> Vect n Bits8
276 | zeros = map (const 0) Fin.range
279 | splitLastAt1 : (n : Nat) -> List a -> Maybe (List1 a, Vect n a)
280 | splitLastAt1 n v = do
281 | let m = minus (length v) n
282 | let (a, b) = splitAt m v
284 | b' <- exactLength n $
fromList b
288 | modFinNZ : Nat -> (b : Nat) -> NonZero b -> Fin b
289 | modFinNZ a b prf = let x = boundModNatNZ a b prf in natToFinLTE (modNatNZ a b prf) x
292 | collapse_ordering : List Ordering -> Ordering
293 | collapse_ordering (LT :: xs) = LT
294 | collapse_ordering (GT :: xs) = GT
295 | collapse_ordering (EQ :: xs) = collapse_ordering xs
296 | collapse_ordering [] = EQ
299 | pad_zero : Nat -> List Bits8 -> List Bits8
303 | l = minus ((S n) * (divCeilNZ l (S n) SIsNonZero)) l
304 | in a <+> replicate l 0
307 | splitAtExact : (n : Nat) -> List a -> Maybe (Vect n a, List a)
308 | splitAtExact n list =
309 | let (a, b) = splitAt n list
310 | in (, b) <$> exactLength n (fromList a)