2019-04-10 15:01:58 +03:00
|
|
|
use Optional None Some
|
|
|
|
|
2019-04-20 21:00:45 +03:00
|
|
|
optionToList : Optional a -> [a]
|
2020-02-22 02:48:12 +03:00
|
|
|
optionToList = cases
|
2019-04-20 21:00:45 +03:00
|
|
|
Some a -> [a]
|
|
|
|
None -> []
|
|
|
|
|
2019-04-10 15:01:58 +03:00
|
|
|
lenLit : [a] -> Nat
|
2020-02-22 02:48:12 +03:00
|
|
|
lenLit = cases
|
2019-04-06 23:28:50 +03:00
|
|
|
[] -> 0
|
2019-04-10 04:42:43 +03:00
|
|
|
[_] -> 1
|
|
|
|
[_, _] -> 2
|
|
|
|
[_, _, _] -> 3
|
2023-01-17 19:08:52 +03:00
|
|
|
_ -> bug "unexpected"
|
2019-04-09 03:24:41 +03:00
|
|
|
|
2019-04-10 15:01:58 +03:00
|
|
|
lenCons : [a] -> Nat
|
2020-02-22 02:48:12 +03:00
|
|
|
lenCons = cases
|
2019-04-10 04:42:43 +03:00
|
|
|
[] -> 0
|
|
|
|
_ +: t -> 1 + lenCons t
|
|
|
|
|
2019-04-10 15:01:58 +03:00
|
|
|
lenSnoc : [a] -> Nat
|
2020-02-22 02:48:12 +03:00
|
|
|
lenSnoc = cases
|
2019-04-10 04:42:43 +03:00
|
|
|
[] -> 0
|
|
|
|
t :+ _ -> 1 + lenSnoc t
|
|
|
|
|
2019-04-18 01:16:21 +03:00
|
|
|
lenConcat1 : [a] -> Nat
|
2020-02-22 02:48:12 +03:00
|
|
|
lenConcat1 = cases
|
2019-04-10 04:42:43 +03:00
|
|
|
[] -> 0
|
2019-04-18 01:16:21 +03:00
|
|
|
[_] ++ tail -> 1 + lenConcat1 tail
|
|
|
|
|
|
|
|
lenConcat2 : [a] -> Nat
|
2020-02-22 02:48:12 +03:00
|
|
|
lenConcat2 = cases
|
2019-04-18 01:16:21 +03:00
|
|
|
[] -> 0
|
|
|
|
prefix ++ [_] -> 1 + lenConcat2 prefix
|
2019-04-10 04:42:43 +03:00
|
|
|
|
2019-04-10 15:01:58 +03:00
|
|
|
head : [a] -> Optional a
|
2020-02-22 02:48:12 +03:00
|
|
|
head = cases
|
2019-04-10 15:01:58 +03:00
|
|
|
h +: _ -> Some h
|
|
|
|
_ -> None
|
|
|
|
|
|
|
|
firstTwo : [a] -> Optional (a, a)
|
2020-02-22 02:48:12 +03:00
|
|
|
firstTwo = cases
|
2019-04-10 15:01:58 +03:00
|
|
|
x +: (y +: _) -> Some (x, y)
|
|
|
|
_ -> None
|
|
|
|
|
|
|
|
lastTwo : [a] -> Optional (a, a)
|
2020-02-22 02:48:12 +03:00
|
|
|
lastTwo = cases
|
2019-04-10 15:01:58 +03:00
|
|
|
_ :+ x :+ y -> Some (x, y)
|
|
|
|
_ -> None
|
|
|
|
|
|
|
|
middle : [a] -> Optional [a]
|
2020-02-22 02:48:12 +03:00
|
|
|
middle = cases
|
2019-04-10 15:01:58 +03:00
|
|
|
[_] ++ m ++ [_] -> Some m
|
|
|
|
_ -> None
|
|
|
|
|
2019-04-20 21:00:45 +03:00
|
|
|
middleNel : [a] -> Optional (a, [a])
|
2020-02-22 02:48:12 +03:00
|
|
|
middleNel = cases
|
2019-04-18 01:16:21 +03:00
|
|
|
[_] ++ (h +: t) ++ [_] -> Some (h, t)
|
|
|
|
_ -> None
|
|
|
|
|
2019-04-20 21:00:45 +03:00
|
|
|
splitAtFour : [a] -> ([a], [a])
|
2020-02-07 05:29:43 +03:00
|
|
|
splitAtFour l = match l with
|
2019-04-20 21:00:45 +03:00
|
|
|
[a] ++ x@(b +: (c +: y@([] :+ d))) ++ tail -> ([a, b, c, d], tail)
|
|
|
|
_ -> (l, [])
|
|
|
|
|
|
|
|
> (
|
|
|
|
lenLit [1, 2, 3],
|
|
|
|
lenCons [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15],
|
|
|
|
lenSnoc [1, 2, 3, 4, 5, 6, 7, 8],
|
|
|
|
lenConcat1 [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11],
|
|
|
|
lenConcat2 [1, 2, 3, 4, 5],
|
|
|
|
optionToList (head []),
|
|
|
|
optionToList (head [1, 2, 3]),
|
|
|
|
optionToList (firstTwo []),
|
|
|
|
optionToList (firstTwo [1]),
|
|
|
|
optionToList (firstTwo [1, 2, 3]),
|
|
|
|
optionToList (lastTwo []),
|
|
|
|
optionToList (lastTwo [1]),
|
|
|
|
optionToList (lastTwo [1, 2, 3]),
|
|
|
|
optionToList (middle []),
|
|
|
|
optionToList (middle [1, 2]),
|
|
|
|
optionToList (middle [1, 2, 3, 4, 5, 6]),
|
|
|
|
optionToList (middleNel []),
|
|
|
|
optionToList (middleNel [1, 2]),
|
|
|
|
optionToList (middleNel [1, 2, 3, 4, 5, 6]),
|
2019-04-26 23:43:16 +03:00
|
|
|
splitAtFour [1, 2, 3, 4, 5, 6, 7])
|