unison/unison-src/tests/pattern-match-seq.u

80 lines
1.4 KiB
Plaintext

use Optional None Some
lenLit : [a] -> Nat
lenLit l = case l of
[] -> 0
[_] -> 1
[_, _] -> 2
[_, _, _] -> 3
lenCons : [a] -> Nat
lenCons l = case l of
[] -> 0
_ +: t -> 1 + lenCons t
_ +: (_ +: t) -> 2 + lenCons t
lenSnoc : [a] -> Nat
lenSnoc l = case l of
[] -> 0
t :+ _ -> 1 + lenSnoc t
lenConcat1 : [a] -> Nat
lenConcat1 l = case l of
[] -> 0
[_] ++ tail -> 1 + lenConcat1 tail
lenConcat2 : [a] -> Nat
lenConcat2 l = case l of
[] -> 0
prefix ++ [_] -> 1 + lenConcat2 prefix
> 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]
head : [a] -> Optional a
head l = case l of
h +: _ -> Some h
_ -> None
> head []
> head [1, 2, 3]
firstTwo : [a] -> Optional (a, a)
firstTwo l = case l of
x +: (y +: _) -> Some (x, y)
_ -> None
> firstTwo []
> firstTwo [1]
> firstTwo [1, 2, 3]
lastTwo : [a] -> Optional (a, a)
lastTwo l = case l of
_ :+ x :+ y -> Some (x, y)
_ -> None
> lastTwo []
> lastTwo [1]
> lastTwo [1, 2, 3]
middle : [a] -> Optional [a]
middle l = case l of
[_] ++ m ++ [_] -> Some m
_ -> None
> middle []
> middle [1, 2]
> middle [1, 2, 3, 4, 5, 6]
middleNel: [a] -> Optional (a, [a])
middleNel l = case l of
[_] ++ (h +: t) ++ [_] -> Some (h, t)
_ -> None
> middleNel []
> middleNel [1, 2]
> middleNel [1, 2, 3, 4, 5, 6]