 
   """
   @spec find_value(t, any, (element -> any)) :: any | :nil
-  def find_value(collection, default \\ nil, fun)
-
-  def find_value(collection, default, fun) when is_list(collection) do
-    do_find_value(collection, default, fun)
-  end
-
-  def find_value(collection, default, fun) do
-    Enumerable.reduce(collection, {:cont, default}, fn(entry, default) ->
+  def find_value(enumerable, default \\ nil, fun)
+
+  def find_value(enumerable, default, fun) when is_list(enumerable) do
+    do_find_value(enumerable, default, fun)
+  end
+
+  def find_value(enumerable, default, fun) do
+    Enumerable.reduce(enumerable, {:cont, default}, fn(entry, default) ->
       fun_entry = fun.(entry)
       if fun_entry, do: {:halt, fun_entry}, else: {:cont, default}
     end) |> elem(1)


  """
  @spec split(t, integer) :: {list, list}
  def split(collection, count) when is_list(collection) and count >= 0 do
    do_split(collection, count, [])
  end

  def split(collection, count) when count >= 0 do
    {_, list1, list2} =
      reduce(collection, {count, [], []}, fn(entry, {counter, acc1, acc2}) ->
        if counter > 0 do
          {counter - 1, [entry|acc1], acc2}
        else
          {counter, acc1, [entry|acc2]}
        end
      end)

    {:lists.reverse(list1), :lists.reverse(list2)}
  end

  def split(collection, count) when count < 0 do
    do_split_reverse(reverse(collection), abs(count), [])
  end

  @doc """
  Splits `collection` in two at the position of the element for which `fun` returns `false` for the
  first time.

  ## Examples


  end

  @doc """
  Returns the sum of all elements.

  Raises `ArithmeticError` if `enumerable` contains a non-numeric value.

  ## Examples

