 
   def map_join(enumerable, joiner, mapper) when is_binary(joiner) and is_function(mapper, 1) do
     reduced = reduce(enumerable, :first, fn
-      entry, :first -> enum_to_string(mapper.(entry))
-      entry, acc    -> [acc, joiner | enum_to_string(mapper.(entry))]
+      entry, :first -> entry_to_string(mapper.(entry))
+      entry, acc -> [acc, joiner | entry_to_string(mapper.(entry))]
     end)
 
     if reduced == :first do


  ## Helpers

  @compile {:inline, enum_to_string: 1, reduce: 3}

  defp enum_to_string(entry) when is_binary(entry), do: entry
  defp enum_to_string(entry), do: String.Chars.to_string(entry)

  defp enumerable_and_count(enumerable, count) when is_list(enumerable) do
    {enumerable, length(enumerable) - abs(count)}


  def join(enumerable, joiner) when is_binary(joiner) do
    reduced = reduce(enumerable, :first, fn
      entry, :first -> entry_to_string(entry)
      entry, acc -> [acc, joiner | entry_to_string(entry)]
    end)
    if reduced == :first do
      ""
