aboutsummaryrefslogtreecommitdiff
path: root/src/Maybe.gleam
diff options
context:
space:
mode:
Diffstat (limited to 'src/Maybe.gleam')
-rw-r--r--src/Maybe.gleam63
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)