unison/unison-src/tests/pattern-match-seq.u
2023-02-27 11:13:10 -05:00

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])