 
   def reduce(collection, acc, fun) do
     { iterator, pointer } = I.iterator(collection)
-    do_reduce(pointer, iterator, acc, fun)
+    case I.iterator(collection) do
+      { iterator, pointer } ->
+        do_reduce(pointer, iterator, acc, fun)
+      list when is_list(list) ->
+        reduce(list, acc, fun)
+    end
   end
 
   @doc """

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

  """
  def join(collection, joiner // "") do
    { iterator, pointer } = I.iterator(collection)
    join(iterator, pointer, joiner)
  end

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

  defp join(iterator, pointer, joiner) do
    do_join(pointer, iterator, joiner, nil)
  end


  end

  def map_reduce(collection, acc, fun) do
    case I.iterator(collection) do
      { iterator, pointer }  ->
        do_map_reduce(pointer, iterator, [], acc, fun)
      list when is_list(list) ->
        map_reduce(list, acc, fun)
    end
  end

  @doc """
