Current section
Files
Jump to
Current section
Files
src/gleamy_structures@non_empty_list.erl
-module(gleamy_structures@non_empty_list).
-compile([no_auto_import, nowarn_unused_vars, nowarn_unused_function, nowarn_nomatch]).
-export([fold/3, count/1, filter/2, to_list/1, from_list/1, reverse/1, map/2]).
-export_type([non_empty_list/1]).
-type non_empty_list(HOO) :: {'end', HOO} | {next, HOO, non_empty_list(HOO)}.
-spec fold(non_empty_list(HOP), HOR, fun((HOR, HOP) -> HOR)) -> HOR.
fold(List, Initial, Fun) ->
case List of
{'end', Item} ->
Fun(Initial, Item);
{next, X, Xs} ->
fold(Xs, Fun(Initial, X), Fun)
end.
-spec count(non_empty_list(any())) -> integer().
count(List) ->
fold(List, 0, fun(Acc, _) -> Acc + 1 end).
-spec filter(non_empty_list(HOY), fun((HOY) -> boolean())) -> list(HOY).
filter(List, Predicate) ->
_pipe = fold(List, [], fun(Acc, Item) -> case Predicate(Item) of
true ->
[Item | Acc];
false ->
Acc
end end),
gleam@list:reverse(_pipe).
-spec to_list(non_empty_list(HPB)) -> list(HPB).
to_list(List) ->
_pipe = fold(List, [], fun(Acc, Item) -> [Item | Acc] end),
gleam@list:reverse(_pipe).
-spec from_list(list(HPE)) -> {ok, non_empty_list(HPE)} | {error, nil}.
from_list(List) ->
case List of
[] ->
{error, nil};
[X | Xs] ->
{ok,
gleam@list:fold(
Xs,
{'end', X},
fun(Acc, Item) -> {next, Item, Acc} end
)}
end.
-spec reverse(non_empty_list(HPJ)) -> non_empty_list(HPJ).
reverse(List) ->
case List of
{'end', _} ->
List;
{next, X, Xs} ->
fold(Xs, {'end', X}, fun(Acc, X@1) -> {next, X@1, Acc} end)
end.
-spec map(non_empty_list(HOU), fun((HOU) -> HOW)) -> non_empty_list(HOW).
map(List, Transform) ->
case List of
{'end', X} ->
{'end', Transform(X)};
{next, X@1, Xs} ->
_pipe = fold(
Xs,
{'end', Transform(X@1)},
fun(Acc, Item) -> {next, Transform(Item), Acc} end
),
reverse(_pipe)
end.