   end
 
   def reduce(collection, acc, f) do
-    reduce(I.iterator(collection), collection, acc, f)
-  end
-
-  def reduce(iterator, collection, acc, f) do
-    do_reduce(iterator.(collection), iterator, acc, f)
+    { iterator, pointer } = I.iterator(collection)
+    reduce(iterator, pointer, acc, f)
+  end
+
+  def reduce(iterator, pointer, acc, f) do
+    do_reduce(pointer, iterator, acc, f)
   end
 
   # Iterates the given function n times, passing values from 1

  #     #=> [2]
  #
  def filter(collection, fun) do
    filter(I.iterator(collection), collection, fun)
  end

  def filter(iterator, collection, fun) do
    do_filter(iterator.(collection), iterator, fun)
  end

  # Filters the collection and maps its values in one pass.

end

defimpl Enum::Iterator, for: List do
  def iterator(list), do: { iterate(&1), iterate(list) }

  defp iterate([h|t]) do
    { h, t }
