       Enum.map_join([1,2,3], &1 * 2, ' = ') #=> '2 = 4 = 6'
 
   """
-  def map_join(collection, joiner // "", mapper) do
+  def map_join(collection, joiner // "", mapper)
+
+  def map_join(collection, joiner, mapper) when is_list(joiner) do
+    binary_to_list map_join(collection, list_to_binary(joiner), mapper)
+  end
+
+  def map_join(collection, joiner, mapper) when is_binary(joiner) do
     { iterator, pointer } = I.iterator(collection)
-    map_join(iterator, pointer, mapper, joiner)
-  end
-
-  defp map_join(iterator, collection, mapper, joiner) when is_list(joiner) do
-    binary_to_list map_join(iterator, collection, mapper, list_to_binary(joiner))
-  end
-
-  defp map_join(iterator, pointer, mapper, joiner) do
     do_map_join(pointer, iterator, mapper, joiner, nil)
   end
 

  end

  def map_reduce(collection, acc, fun) do
    { iterator, pointer } = I.iterator(collection)
    do_map_reduce(pointer, iterator, [], acc, fun)
  end

  @doc """

      Enum.join([1,2,3], ' = ') #=> '1 = 2 = 3'

  """
  def join(collection, joiner // "")

  def join(collection, joiner) when is_list(joiner) do
    binary_to_list join(collection, list_to_binary(joiner))
  end

  def join(collection, joiner) when is_binary(joiner) do
    { iterator, pointer } = I.iterator(collection)
    do_join(pointer, iterator, joiner, nil)
  end

