diff options
Diffstat (limited to 'src/Maybe.gleam')
-rw-r--r-- | src/Maybe.gleam | 63 |
1 files changed, 63 insertions, 0 deletions
diff --git a/src/Maybe.gleam b/src/Maybe.gleam new file mode 100644 index 0000000..2805a4d --- /dev/null +++ b/src/Maybe.gleam @@ -0,0 +1,63 @@ +module Maybe + +export Maybe(..), is_just/1, is_nothing/1, map/2, flatten/1, flat_map/2, + unwrap/2 + +type Maybe(x) + = Just(x) + | Nothing + +fn is_just(maybe) = + case maybe + | Just(_) => True + | Nothing => False + +test is_just() = + is_just(Just(1)) |> Assert.true + is_just(Nothing) |> Assert.false + +fn is_nothing(maybe) = + case maybe + | Just(_) => False + | Nothing => True + +test is_nothing() = + is_nothing(Just(1)) |> Assert.false + is_nothing(Nothing) |> Assert.true + +fn map(maybe, fun) = + case maybe + | Just(x) => fun(x) + | Nothing => Nothing + +test map() = + map(Just(1), |x| x + 1) |> Assert.equal(_, Just(2)) + map(Nothing, |x| x + 1) |> Assert.equal(Nothing) + +fn flatten(maybe) = + maybe + |> unwrap(_, Nothing) + +test flatten() = + flatten(Just(Just(1))) |> Assert.equal(Just(1)) + flatten(Just(Nothing)) |> Assert.equal(Nothing) + flatten(Nothing) |> Assert.equal(Nothing) + +fn flat_map(maybe, fun) = + maybe + |> map(_, fun) + |> flatten + +test flat_map() = + flat_map(Nothing, |x| Just(x + 1)) |> Assert.equal(Nothing) + flat_map(Just(1), |x| Just(x + 1)) |> Assert.equal(Just(2)) + flat_map(Just(1), |_| Nothing) |> Assert.equal(Nothing) + +fn unwrap(maybe, fallback) = + case maybe + | Just(v) => v + | Nothing => fallback + +test unwrap() = + unwrap(Just(1), 50) |> Assert.equal(1) + unwrap(Nothing, 50) |> Assert.equal(50) |