   #     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`.

defmodule Enum do
  defprotocol Iterator, [iterator(collection)], only: [List, Tuple]
  refer Enum::Iterator, as: I

  #     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

