     map_reduce(collection, -abs(count), fn(x, acc) -> {x, acc + 1} end)
   end
 
-  defp to_string(mapper, entry) do
-    case mapper.(entry) do
-      x when is_binary(x) -> x
-      o -> String.Chars.to_string(o)
-    end
-  end
+  defp enum_to_string(entry) when is_binary(entry), do: entry
+  defp enum_to_string(entry), do: String.Chars.to_string(entry)
 
   ## Implementations
 


  def map_join(collection, joiner, mapper) when is_binary(joiner) do
    reduced = reduce(collection, :first, fn
      entry, :first -> to_string(mapper, entry)
      entry, acc    -> acc <> joiner <> to_string(mapper, entry)
    end)

    if reduced == :first do
      ""
    else
      reduced
    end
  end



  ## Helpers

  @compile {:inline, enum_to_string: 1}

  defp enumerate_and_count(collection, count) when is_list(collection) do
    {collection, length(collection) - abs(count)}
