@@ -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
4679end
0 commit comments