Packages
gleam_stdlib
0.10.0
1.0.3
1.0.2
1.0.1
1.0.0
0.71.0
0.70.0
0.69.0
0.68.1
0.68.0
0.67.1
0.67.0
0.65.0
0.64.0
0.63.2
0.63.1
0.63.0
0.62.1
0.62.0
0.61.0
0.60.0
0.59.0
0.58.0
0.57.0
0.56.0
0.55.0
0.54.0
0.53.0
0.52.0
0.51.0
0.50.0
0.49.0
0.48.0
0.47.0
0.46.0
0.45.0
0.44.0
0.43.0
0.42.0
0.41.0
0.40.0
0.39.0
0.38.0
0.37.0
0.36.0
0.35.1
0.35.0
0.34.0
0.33.1
0.33.0
0.32.1
0.32.0
0.31.0
0.30.2
0.30.1
0.30.0
0.29.2
0.29.1
0.29.0
0.28.2
0.28.1
0.28.0
0.27.0
0.26.1
0.26.0
0.25.0
0.24.0
0.23.0
0.22.3
0.22.2
0.22.1
0.22.0
0.21.0
0.20.0
0.19.3
0.19.2
0.19.1
0.19.0
0.18.1
0.18.0
0.18.0-rc1
0.17.1
0.17.0
0.16.0
0.15.0
0.14.0
0.13.0
0.12.0
0.11.0
0.10.1
0.10.0
0.9.0
0.8.0
0.7.0
0.6.0
0.5.0
0.4.0
0.4.0-rc1
0.3.1
0.3.0
0.2.0
retired
A standard library for the Gleam programming language
Current section
Files
Jump to
Current section
Files
gen/src/gleam@iterator.erl
-module(gleam@iterator).
-compile(no_auto_import).
-export([unfold/2, repeatedly/1, repeat/1, from_list/1, fold/3, run/1, to_list/1, take/2, drop/2, map/2, filter/2, cycle/1, range/2]).
do_unfold(Initial, F) ->
fun() -> case F(Initial) of
{next, X, Acc} ->
{continue, X, do_unfold(Acc, F)};
done ->
stop
end end.
unfold(Initial, F) ->
{iterator, do_unfold(Initial, F)}.
repeatedly(F) ->
unfold(nil, fun(Acc) -> {next, F(), Acc} end).
repeat(X) ->
repeatedly(fun() -> X end).
from_list(List) ->
Yield = fun(Acc) -> case Acc of
[] ->
done;
[Head | Tail] ->
{next, Head, Tail}
end end,
unfold(List, Yield).
do_fold(Iterator, Initial, F) ->
case Iterator() of
{continue, Element, Iterator1} ->
do_fold(Iterator1, F(Element, Initial), F);
stop ->
Initial
end.
fold(Iterator, Initial, F) ->
do_fold(erlang:element(2, Iterator), Initial, F).
run(Iterator) ->
fold(Iterator, nil, fun(_, Acc) -> Acc end).
to_list(Iterator) ->
gleam@list:reverse(fold(Iterator, [], fun(E, Acc) -> [E | Acc] end)).
do_take(Iterator, Desired, Acc) ->
case Desired > 0 of
true ->
case Iterator() of
{continue, Element, Iterator1} ->
do_take(Iterator1, Desired - 1, [Element | Acc]);
stop ->
Acc
end;
false ->
Acc
end.
take(Iterator, Desired) ->
gleam@list:reverse(do_take(erlang:element(2, Iterator), Desired, [])).
do_drop(Iterator, Desired) ->
case Desired > 0 of
true ->
case Iterator() of
{continue, _, Iterator1} ->
do_drop(Iterator1, Desired - 1);
stop ->
fun() -> stop end
end;
false ->
Iterator
end.
drop(Iterator, Desired) ->
{iterator, do_drop(erlang:element(2, Iterator), Desired)}.
do_map(Continuation, F) ->
fun() -> case Continuation() of
{continue, E, Continuation1} ->
{continue, F(E), do_map(Continuation1, F)};
stop ->
stop
end end.
map(Iterator, F) ->
{iterator, do_map(erlang:element(2, Iterator), F)}.
do_filter(Iterator, Predicate) ->
fun() -> case Iterator() of
{continue, E, Iterator1} ->
case Predicate(E) of
true ->
{continue, E, do_filter(Iterator1, Predicate)};
false ->
(do_filter(Iterator1, Predicate))()
end;
stop ->
stop
end end.
filter(Iterator, Predicate) ->
{iterator, do_filter(erlang:element(2, Iterator), Predicate)}.
do_cycle(Next, Reset) ->
fun() -> case Next() of
{continue, E, Iterator} ->
{continue, E, do_cycle(Iterator, Reset)};
stop ->
(do_cycle(Reset, Reset))()
end end.
cycle(Iterator) ->
{iterator,
do_cycle(erlang:element(2, Iterator), erlang:element(2, Iterator))}.
do_range(Current, Limit, Inc) ->
case Current =:= Limit of
true ->
fun() -> stop end;
false ->
fun() ->
{continue, Current, do_range(Current + Inc, Limit, Inc)}
end
end.
range(Start, Stop) ->
{iterator, do_range(Start, Stop, case Start < Stop of
true ->
1;
false ->
-1
end)}.