 
   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)
+      entry, :first -> [enum_to_string(mapper.(entry))]
+      entry, acc    -> [enum_to_string(mapper.(entry)), joiner|acc]
     end)
 
     if reduced == :first do
       ""
     else
-      reduced
+      IO.chardata_to_string :lists.reverse(reduced)
     end
   end
 


  def join(collection, joiner) when is_binary(joiner) do
    reduced = reduce(collection, :first, fn
      entry, :first  -> to_string(entry)
      entry, acc -> acc <> joiner <> to_string(entry)
    end)
    if reduced == :first do
      ""
    else
      reduced
    end
  end


    map_reduce(collection, -abs(count), fn(x, acc) -> {x, acc + 1} 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

