 
   ## find_value
 
+  defp do_find_value([h|t], ifnone, fun) do
+    case fun.(h) do
+      x in [false, nil] -> do_find_value(t, ifnone, fun)
+      other -> other
+    end
+  end
+
+  defp do_find_value([], ifnone, _) do
+    ifnone
+  end
+
   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
+      x in [false, nil] -> do_find_value(iterator.(next), iterator, ifnone, fun)
+      other -> other
     end
   end
 


  ## find

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


      #=> 3

  """
  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 """
