Packages
gleam_stdlib
0.17.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@queue.erl
-module(gleam@queue).
-compile(no_auto_import).
-export([new/0, from_list/1, to_list/1, is_empty/1, length/1, push_back/2, push_front/2, pop_back/1, pop_front/1, reverse/1, is_logically_equal/3, is_equal/2]).
-export_type([queue/1]).
-opaque queue(EPR) :: {queue, list(EPR), list(EPR)}.
-spec new() -> queue(any()).
new() ->
{queue, [], []}.
-spec from_list(list(EPY)) -> queue(EPY).
from_list(List) ->
{queue, [], List}.
-spec to_list(queue(EQB)) -> list(EQB).
to_list(Queue) ->
_pipe = erlang:element(3, Queue),
gleam@list:append(_pipe, gleam@list:reverse(erlang:element(2, Queue))).
-spec is_empty(queue(any())) -> boolean().
is_empty(Queue) ->
(erlang:element(2, Queue) =:= []) andalso (erlang:element(3, Queue) =:= []).
-spec length(queue(any())) -> integer().
length(Queue) ->
gleam@list:length(erlang:element(2, Queue)) + gleam@list:length(
erlang:element(3, Queue)
).
-spec push_back(queue(EQI), EQI) -> queue(EQI).
push_back(Queue, Item) ->
{queue, [Item | erlang:element(2, Queue)], erlang:element(3, Queue)}.
-spec push_front(queue(EQL), EQL) -> queue(EQL).
push_front(Queue, Item) ->
{queue, erlang:element(2, Queue), [Item | erlang:element(3, Queue)]}.
-spec pop_back(queue(EQO)) -> {ok, {EQO, queue(EQO)}} | {error, nil}.
pop_back(Queue) ->
case Queue of
{queue, [], []} ->
{error, nil};
{queue, [], Out} ->
pop_back({queue, gleam@list:reverse(Out), []});
{queue, [First | Rest], Out@1} ->
Queue@1 = {queue, Rest, Out@1},
{ok, {First, Queue@1}}
end.
-spec pop_front(queue(EQT)) -> {ok, {EQT, queue(EQT)}} | {error, nil}.
pop_front(Queue) ->
case Queue of
{queue, [], []} ->
{error, nil};
{queue, In, []} ->
pop_front({queue, [], gleam@list:reverse(In)});
{queue, In@1, [First | Rest]} ->
Queue@1 = {queue, In@1, Rest},
{ok, {First, Queue@1}}
end.
-spec reverse(queue(EQY)) -> queue(EQY).
reverse(Queue) ->
{queue, erlang:element(3, Queue), erlang:element(2, Queue)}.
-spec check_equal(
list(ERB),
list(ERB),
list(ERB),
list(ERB),
fun((ERB, ERB) -> boolean())
) -> boolean().
check_equal(Xs, X_tail, Ys, Y_tail, Eq) ->
case {Xs, X_tail, Ys, Y_tail} of
{[], [], [], []} ->
true;
{[X | Xs@1], _@1, [Y | Ys@1], _@2} ->
case Eq(X, Y) of
false ->
false;
true ->
check_equal(Xs@1, X_tail, Ys@1, Y_tail, Eq)
end;
{[], [_@3 | _@4], _@5, _@6} ->
check_equal(gleam@list:reverse(X_tail), [], Ys, Y_tail, Eq);
{_@7, _@8, [], [_@9 | _@10]} ->
check_equal(Xs, X_tail, gleam@list:reverse(Y_tail), [], Eq);
{_@11, _@12, _@13, _@14} ->
false
end.
-spec is_logically_equal(queue(ERG), queue(ERG), fun((ERG, ERG) -> boolean())) -> boolean().
is_logically_equal(A, B, Element_is_equal) ->
check_equal(
erlang:element(3, A),
erlang:element(2, A),
erlang:element(3, B),
erlang:element(2, B),
Element_is_equal
).
-spec is_equal(queue(ERJ), queue(ERJ)) -> boolean().
is_equal(A, B) ->
check_equal(
erlang:element(3, A),
erlang:element(2, A),
erlang:element(3, B),
erlang:element(2, B),
fun(A@1, B@1) -> A@1 =:= B@1 end
).