       #=> 3
 
   """
-  def find(collection, ifnone // nil, fun) do
-    { iterator, pointer } = I.iterator(collection)
-    do_find(pointer, iterator, ifnone, fun)
+  def find(collection, ifnone // nil, fun)
+
+  def find(collection, ifnone, fun) when is_list(collection) do
+    do_find(collection, ifnone, fun)
+  end
+
+  def find(collection, ifnone, fun) do
+    case I.iterator(collection) do
+      { iterator, pointer } ->
+        do_find(pointer, iterator, ifnone, fun)
+      list when is_list(list) ->
+        find(list, ifnone, fun)
+    end
   end
 
   @doc """


  ## find_value

  defp do_find_value({ h, next }, iterator, ifnone, fun) do
    case fun.(h) do
      x in [false, nil] ->
        do_find_value(iterator.(next), iterator, ifnone, fun)
      other ->
        other
    end
  end


        #=> 2

  """
  def find_index(collection, fun) when is_list(collection) do
    do_find_index(collection, 1, fun)
  end

  def find_index(collection, fun) do
    case O.iterator(collection) do
      { iterator, pointer } ->
        do_find_index(pointer, iterator, 1, fun)
      list when is_list(list) ->
        find_index(list, fun)
    end
  end

  @doc """
