lib/shopify/graphql/helpers/queue.ex

defmodule Shopify.GraphQL.Helpers.Queue do
  @spec take(:queue.queue, non_neg_integer) :: { { list, non_neg_integer }, :queue.queue }
  def take(queue, n) do
    do_take(queue, :queue.new(), 0, n)
  end

  defp do_take(queue, acc, acc_len, 0) do
    { { :queue.to_list(acc), acc_len }, queue }
  end

  defp do_take(queue, acc, acc_len, n) do
    case :queue.out(queue) do
      { { :value, item }, queue } ->
        do_take(queue, :queue.in(item, acc), acc_len + 1, n - 1)
      { :empty, queue } ->
        { { :queue.to_list(acc), acc_len }, queue }
    end
  end
end