Qex (Qex v0.5.0) View Source

A :queue wrapper with improvements in API and addition of Protocol implementations

Protocols

Inspect, Collectable and Enumerable are implemented

iex> inspect Qex.new
"#Qex<[]>"

iex> Enum.count Qex.new(1..5)
5

iex> Enum.empty? Qex.new
true

iex> Enum.map Qex.new([1, 2, 3]), &(&1 + 1)
[2, 3, 4]

iex> inspect Enum.into(1..5, %Qex{})
"#Qex<[1, 2, 3, 4, 5]>"

Link to this section Summary

Functions

Return the first item in the queue in {:value, term} tuple, return :empty if the queue is empty

Retun the first item in the queue, raise if it's empty

Join two queues together

Return the last item in the queue in {:value, term} tuple, return :empty if the queue is empty

Retun the last item in the queue, raise if it's empty

Create a new queue from a range

Get and remove an element from the front of the queue

Get and remove an element from the back of the queue

Add an element to the back of the queue

Add an element to the front of the queue

Reverse a queue

Split a queue into two, the front n items are put in the first queue

Link to this section Types

Specs

t()

Specs

t(type)

Link to this section Functions

Specs

first(t()) :: {:value, term()} | :empty

Return the first item in the queue in {:value, term} tuple, return :empty if the queue is empty

iex> q1 = Qex.new 1..3
iex> Qex.first(q1)
{:value, 1}
iex> q2 = Qex.new []
iex> Qex.first(q2)
:empty

Specs

first!(t()) :: term() | no_return()

Retun the first item in the queue, raise if it's empty

iex> q1 = Qex.new 1..3
iex> Qex.first!(q1)
1

Specs

join(t(), t()) :: t()

Join two queues together

iex> q1 = Qex.new 1..3
iex> q2 = Qex.new 4..5
iex> Enum.to_list Qex.join(q1, q2)
[1, 2, 3, 4, 5]

Specs

last(t()) :: {:value, term()} | :empty

Return the last item in the queue in {:value, term} tuple, return :empty if the queue is empty

iex> q1 = Qex.new 1..3
iex> Qex.last(q1)
{:value, 3}
iex> q2 = Qex.new []
iex> Qex.last(q2)
:empty

Specs

last!(t()) :: term() | no_return()

Retun the last item in the queue, raise if it's empty

iex> q1 = Qex.new 1..3
iex> Qex.last!(q1)
3

Specs

new([term()] | Range.t()) :: t()

Create a new queue from a range

iex> inspect Qex.new(1..3)
"#Qex<[1, 2, 3]>"

Create a new queue from a list

iex> inspect Qex.new([1, 2, 3])
"#Qex<[1, 2, 3]>"

Specs

pop(t()) :: {{:value, term()}, t()} | {:empty, t()}

Get and remove an element from the front of the queue

iex> q = Qex.new([:front, :mid])
iex> {{:value, item}, _q} = Qex.pop(q)
iex> item
:front

iex> q = Qex.new
iex> {empty, _q} = Qex.pop(q)
iex> empty
:empty

Specs

pop!(t()) :: {term(), t()} | no_return()

Specs

pop_back(t()) :: {{:value, term()}, t()} | {:empty, t()}

Get and remove an element from the back of the queue

iex> q = Qex.new([:mid, :back])
iex> {{:value, item}, _q} = Qex.pop_back(q)
iex> item
:back

iex> q = Qex.new
iex> {empty, _q} = Qex.pop_back(q)
iex> empty
:empty

Specs

pop_back!(t()) :: {term(), t()} | no_return()

Specs

push(t(), term()) :: t()

Add an element to the back of the queue

iex> q = Qex.new([:mid])
iex> Enum.to_list Qex.push(q, :back)
[:mid, :back]

Specs

push_front(t(), term()) :: t()

Add an element to the front of the queue

iex> q = Qex.new([:mid])
iex> Enum.to_list Qex.push_front(q, :front)
[:front, :mid]

Specs

reverse(t()) :: t()

Reverse a queue

iex> q = Qex.new(1..3)
iex> Enum.to_list q
[1, 2, 3]
iex> Enum.to_list Qex.reverse(q)
[3, 2, 1]

Specs

split(t(), pos_integer()) :: {t(), t()}

Split a queue into two, the front n items are put in the first queue

iex> q = Qex.new 1..5
iex> {q1, q2} = Qex.split(q, 3)
iex> Enum.to_list q1
[1, 2, 3]
iex> Enum.to_list q2
[4, 5]