-module(fused@internal@queue).
-compile([no_auto_import, nowarn_unused_vars, nowarn_unused_function, nowarn_nomatch, inline]).
-define(FILEPATH, "src/fused/internal/queue.gleam").
-export([new/0, push/2, pop/1]).
-export_type([queue/1]).
-if(?OTP_RELEASE >= 27).
-define(MODULEDOC(Str), -moduledoc(Str)).
-define(DOC(Str), -doc(Str)).
-else.
-define(MODULEDOC(Str), -compile([])).
-define(DOC(Str), -compile([])).
-endif.
?MODULEDOC(false).
-opaque queue(FSL) :: {queue, list(FSL), list(FSL)}.
-file("src/fused/internal/queue.gleam", 7).
?DOC(false).
-spec new() -> queue(any()).
new() ->
{queue, [], []}.
-file("src/fused/internal/queue.gleam", 11).
?DOC(false).
-spec push(queue(FSO), FSO) -> queue(FSO).
push(Queue, X) ->
{queue, Push, Pop} = Queue,
Push@1 = [X | Push],
{queue, Push@1, Pop}.
-file("src/fused/internal/queue.gleam", 17).
?DOC(false).
-spec pop(queue(FSR)) -> {ok, {FSR, queue(FSR)}} | {error, nil}.
pop(Queue) ->
case Queue of
{queue, [X], []} ->
{ok, {X, {queue, [], []}}};
{queue, Push, [X@1 | Pop]} ->
{ok, {X@1, {queue, Push, Pop}}};
{queue, [], []} ->
{error, nil};
{queue, Push@1, []} ->
_pipe = {queue, [], lists:reverse(Push@1)},
pop(_pipe)
end.