Skip to content

Commit 4d2c3b9

Browse files
committed
sync more APIs
1 parent 2385d57 commit 4d2c3b9

File tree

1 file changed

+33
-0
lines changed

1 file changed

+33
-0
lines changed

lib/queue.ex

Lines changed: 33 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -28,6 +28,11 @@ defmodule Qex do
2828
%__MODULE__{data: :queue.in(item, q)}
2929
end
3030

31+
@spec push_front(t, term) :: t
32+
def push_front(%__MODULE__{data: q}, item) do
33+
%__MODULE__{data: :queue.in_r(item, q)}
34+
end
35+
3136
@spec pop(t) :: {{:value, term}, t} | {:empty, t}
3237
def pop(%__MODULE__{data: q}) do
3338
case :queue.out(q) do
@@ -43,4 +48,32 @@ defmodule Qex do
4348
{:empty, _q} -> raise "Queue is empty"
4449
end
4550
end
51+
52+
@spec pop_back(t) :: {{:value, term}, t} | {:empty, t}
53+
def pop_back(%__MODULE__{data: q}) do
54+
case :queue.out_r(q) do
55+
{{:value, v}, q} -> {{:value, v}, %__MODULE__{data: q}}
56+
{:empty, q} -> {:empty, %__MODULE__{data: q}}
57+
end
58+
end
59+
60+
@spec pop_back!(t) :: {term, t} | no_return
61+
def pop_back!(%__MODULE__{data: q}) do
62+
case :queue.out_r(q) do
63+
{{:value, v}, q} -> {v, %__MODULE__{data: q}}
64+
{:empty, _q} -> raise "Queue is empty"
65+
end
66+
end
67+
68+
@spec reverse(t) :: t
69+
def reverse(%__MODULE__{data: q}) do
70+
%__MODULE__{data: :queue.reverse(q)}
71+
end
72+
73+
@spec split(t, pos_integer) :: {t, t}
74+
def split(%__MODULE__{data: q}, n) do
75+
with {q1, q2} <- :queue.split(n, q) do
76+
{%__MODULE__{data: q1}, %__MODULE__{data: q2}}
77+
end
78+
end
4679
end

0 commit comments

Comments
 (0)