   #     Enum.empty? [1,2,3] #=> false
   #
   def empty?(collection) do
-    I.iterator(collection).() == __STOP_ITERATOR__
+    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`.

  #     # => 3
  #
  def detect(collection, ifnone // nil, fun) do
    _detect(I.iterator(collection).(), ifnone, fun)
  end

  # Similar to detect, but returns the value of the function

  #     #=> [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

  # Iterates the collection from left to right passing an
