Skip to main content

src/fused@internal@queue.erl

-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.