defmodule Cldr.Enum do
  @doc """
  Very simple reduce that passes both the head and the tail
  to the reducing function so it has some lookahead.
  """
  def reduce_peeking(_list, {:halt, acc}, _fun),
    do: {:halted, acc}
  def reduce_peeking(list, {:suspend, acc}, fun),
    do: {:suspended, acc, &reduce_peeking(list, &1, fun)}
  def reduce_peeking([], {:cont, acc}, _fun),
    do: {:done, acc}
  def reduce_peeking([head | tail], {:cont, acc}, fun),
    do: reduce_peeking(tail, fun.(head, tail, acc), fun)
  def reduce_peeking(list, acc, fun),
    do: reduce_peeking(list, {:cont, acc}, fun) |> elem(1)
  def combine_list([head]),
    do: [to_string(head)]
  def combine_list([head | [next | tail]]),
    do: [to_string(head) | combine_list(["#{head}_#{next}" | tail])]
end