lib/data_structures/queue.ex

defmodule Queue do
  @moduledoc """
  Documentation for `Queue` data structure
  """

  @doc """
  Creates a new, empty qeue

  ## Examples

      iex> Queue.new()
      []

  """
  @spec new :: []
  def new, do: []

  @doc """
  Checks if queue is empty

  ## Examples

      iex> Queue.is_empty([])
      true

      iex> Queue.is_empty([1, "2", :atom, 5])
      false

  """
  @spec is_empty(list) :: boolean
  def is_empty(queue) do
    if length(queue) == 0, do: true, else: false
  end


  @doc """
  Adds element to queue

  ## Examples

      iex> Queue.enqueue([1], 2)
      [1, 2]

      iex> Queue.enqueue([1], 2)
      [1, 2]

      iex> Queue.enqueue([1, "2", :atom], 5)
      [1, "2", :atom, 5]

  """
  @spec enqueue(list, any) :: list
  def enqueue(queue, element) when is_list(element) do
    Enum.concat(queue, element)
  end

  def enqueue(queue, element) do
    Enum.concat(queue, [element])
  end

  @doc """
  Deletes element from queue

  ## Examples

      iex> Queue.dequeue([1])
      []

      iex> Queue.dequeue([])
      []

      iex> Queue.dequeue([1, 2, 3])
      [2, 3]

      iex> Queue.dequeue([1, "2", :atom])
      ["2", :atom]

  """
  @spec dequeue(list) :: list
  def dequeue(queue) when length(queue) <= 1, do: []

  def dequeue([_head | tail]), do: tail
end