   #     Enum.all? [1,nil,3] #=> false
   #
   def all?(collection, fun // fn(x) { x }) do
-    _all?(I.iterator(collection).(), fun)
+    all?(I.iterator(collection), collection, fun)
+  end
+
+  def all?(iterator, collection, fun) do
+    do_all?(iterator.(collection), iterator, fun)
   end
 
   # Invokes the given `fun` for each item in the `collection`

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

  # Iterates the collection from left to right passing an

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

  def each(iterator, collection, fun) do
    do_each(iterator.(collection), iterator, fun)
    collection
  end

