mirror of
https://github.com/unisonweb/unison.git
synced 2024-10-26 11:07:48 +03:00
87 lines
1.8 KiB
Plaintext
87 lines
1.8 KiB
Plaintext
use Optional None Some
|
|
|
|
optionToList : Optional a -> [a]
|
|
optionToList = cases
|
|
Some a -> [a]
|
|
None -> []
|
|
|
|
lenLit : [a] -> Nat
|
|
lenLit = cases
|
|
[] -> 0
|
|
[_] -> 1
|
|
[_, _] -> 2
|
|
[_, _, _] -> 3
|
|
_ -> bug "unexpected"
|
|
|
|
lenCons : [a] -> Nat
|
|
lenCons = cases
|
|
[] -> 0
|
|
_ +: t -> 1 + lenCons t
|
|
|
|
lenSnoc : [a] -> Nat
|
|
lenSnoc = cases
|
|
[] -> 0
|
|
t :+ _ -> 1 + lenSnoc t
|
|
|
|
lenConcat1 : [a] -> Nat
|
|
lenConcat1 = cases
|
|
[] -> 0
|
|
[_] ++ tail -> 1 + lenConcat1 tail
|
|
|
|
lenConcat2 : [a] -> Nat
|
|
lenConcat2 = cases
|
|
[] -> 0
|
|
prefix ++ [_] -> 1 + lenConcat2 prefix
|
|
|
|
head : [a] -> Optional a
|
|
head = cases
|
|
h +: _ -> Some h
|
|
_ -> None
|
|
|
|
firstTwo : [a] -> Optional (a, a)
|
|
firstTwo = cases
|
|
x +: (y +: _) -> Some (x, y)
|
|
_ -> None
|
|
|
|
lastTwo : [a] -> Optional (a, a)
|
|
lastTwo = cases
|
|
_ :+ x :+ y -> Some (x, y)
|
|
_ -> None
|
|
|
|
middle : [a] -> Optional [a]
|
|
middle = cases
|
|
[_] ++ m ++ [_] -> Some m
|
|
_ -> None
|
|
|
|
middleNel : [a] -> Optional (a, [a])
|
|
middleNel = cases
|
|
[_] ++ (h +: t) ++ [_] -> Some (h, t)
|
|
_ -> None
|
|
|
|
splitAtFour : [a] -> ([a], [a])
|
|
splitAtFour l = match l with
|
|
[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]),
|
|
splitAtFour [1, 2, 3, 4, 5, 6, 7])
|