aboutsummaryrefslogtreecommitdiff
path: root/aoc2023/build/packages/gleam_stdlib/src/gleam@option.erl
diff options
context:
space:
mode:
Diffstat (limited to 'aoc2023/build/packages/gleam_stdlib/src/gleam@option.erl')
-rw-r--r--aoc2023/build/packages/gleam_stdlib/src/gleam@option.erl147
1 files changed, 147 insertions, 0 deletions
diff --git a/aoc2023/build/packages/gleam_stdlib/src/gleam@option.erl b/aoc2023/build/packages/gleam_stdlib/src/gleam@option.erl
new file mode 100644
index 0000000..5c20713
--- /dev/null
+++ b/aoc2023/build/packages/gleam_stdlib/src/gleam@option.erl
@@ -0,0 +1,147 @@
+-module(gleam@option).
+-compile([no_auto_import, nowarn_unused_vars, nowarn_unused_function]).
+
+-export([all/1, is_some/1, is_none/1, to_result/2, from_result/1, unwrap/2, lazy_unwrap/2, map/2, flatten/1, then/2, 'or'/2, lazy_or/2, values/1]).
+-export_type([option/1]).
+
+-type option(GB) :: {some, GB} | none.
+
+-spec do_all(list(option(GC)), list(GC)) -> option(list(GC)).
+do_all(List, Acc) ->
+ case List of
+ [] ->
+ {some, Acc};
+
+ [X | Rest] ->
+ Accumulate = fun(Acc@1, Item) -> case {Acc@1, Item} of
+ {{some, Values}, {some, Value}} ->
+ {some, [Value | Values]};
+
+ {_, _} ->
+ none
+ end end,
+ Accumulate(do_all(Rest, Acc), X)
+ end.
+
+-spec all(list(option(GI))) -> option(list(GI)).
+all(List) ->
+ do_all(List, []).
+
+-spec is_some(option(any())) -> boolean().
+is_some(Option) ->
+ Option /= none.
+
+-spec is_none(option(any())) -> boolean().
+is_none(Option) ->
+ Option =:= none.
+
+-spec to_result(option(GR), GU) -> {ok, GR} | {error, GU}.
+to_result(Option, E) ->
+ case Option of
+ {some, A} ->
+ {ok, A};
+
+ _ ->
+ {error, E}
+ end.
+
+-spec from_result({ok, GX} | {error, any()}) -> option(GX).
+from_result(Result) ->
+ case Result of
+ {ok, A} ->
+ {some, A};
+
+ _ ->
+ none
+ end.
+
+-spec unwrap(option(HC), HC) -> HC.
+unwrap(Option, Default) ->
+ case Option of
+ {some, X} ->
+ X;
+
+ none ->
+ Default
+ end.
+
+-spec lazy_unwrap(option(HE), fun(() -> HE)) -> HE.
+lazy_unwrap(Option, Default) ->
+ case Option of
+ {some, X} ->
+ X;
+
+ none ->
+ Default()
+ end.
+
+-spec map(option(HG), fun((HG) -> HI)) -> option(HI).
+map(Option, Fun) ->
+ case Option of
+ {some, X} ->
+ {some, Fun(X)};
+
+ none ->
+ none
+ end.
+
+-spec flatten(option(option(HK))) -> option(HK).
+flatten(Option) ->
+ case Option of
+ {some, X} ->
+ X;
+
+ none ->
+ none
+ end.
+
+-spec then(option(HO), fun((HO) -> option(HQ))) -> option(HQ).
+then(Option, Fun) ->
+ case Option of
+ {some, X} ->
+ Fun(X);
+
+ none ->
+ none
+ end.
+
+-spec 'or'(option(HT), option(HT)) -> option(HT).
+'or'(First, Second) ->
+ case First of
+ {some, _} ->
+ First;
+
+ none ->
+ Second
+ end.
+
+-spec lazy_or(option(HX), fun(() -> option(HX))) -> option(HX).
+lazy_or(First, Second) ->
+ case First of
+ {some, _} ->
+ First;
+
+ none ->
+ Second()
+ end.
+
+-spec do_values(list(option(IB)), list(IB)) -> list(IB).
+do_values(List, Acc) ->
+ case List of
+ [] ->
+ Acc;
+
+ [X | Xs] ->
+ Accumulate = fun(Acc@1, Item) -> case Item of
+ {some, Value} ->
+ [Value | Acc@1];
+
+ none ->
+ Acc@1
+ end end,
+ Accumulate(do_values(Xs, Acc), X)
+ end.
+
+-spec values(list(option(IG))) -> list(IG).
+values(Options) ->
+ do_values(Options, []).