   #     #=> 6
   #
   def foldl(collection, acc, f) do
-    _foldl(I.iterator(collection).(), acc, f)
+    foldl(I.iterator(collection), collection, acc, f)
+  end
+
+  def foldl(iterator, collection, acc, f) do
+    do_foldl(iterator.(collection), iterator, acc, f)
   end
 
   # Join the given `collection` according to `joiner`.

  #     Enum.each ['some', 'example'], fn(x) { IO.puts x }
  #
  def each(collection, fun) do
    _each(I.iterator(collection).(), fun)
    collection
  end


  #     Enum.empty? [1,2,3] #=> false
  #
  def empty?(collection) do
    empty?(I.iterator(collection), collection)
  end

  def empty?(iterator, collection) do
    iterator.(collection) == __STOP_ITERATOR__
  end

  # Invokes the given `fun` for each item in the `collection`.
