let { run, Test, TestCase, assert_eq, test, group, ? } = import! std.test let { (<|) } = import! std.function let prelude @ { Alternative } = import! std.prelude let { Applicative, (*>) } = import! std.applicative let int = import! std.int let list @ { ? }= import! std.list let option = import! std.option let { (<|>), or, empty } = import! std.alternative let test_alt ?alt show eq : [Alternative f] -> Show (f Int) -> Eq (f Int) -> _ = let { wrap } = alt.applicative let assert = assert_eq ?show ?eq [ test "empty equal" <| \_ -> (assert empty empty), test "or selects non-empty" <| \_ -> (assert (empty <|> wrap 1) (wrap 1)), test "empty <|> empty == empty" <| \_ -> (assert (empty <|> empty) empty), test "or selects non-empty 2" <| \_ -> (assert (empty <|> empty <|> wrap 10) (wrap 10)) ] let tests: TestCase r () = group "alternative" [ group "option" (test_alt option.show option.eq), group "list" (test_alt list.show list.eq) ] tests