       Enum.drop_while [1,2,3,4,5], fn(x) -> x < 3 end
       #=> [3,4,5]
   """
+  def drop_while(collection, fun) when is_list(collection) do
+    do_drop_while(collection, fun)
+  end
+
   def drop_while(collection, fun) do
-    { iterator, pointer } = O.iterator(collection)
-    module = O.__impl_for__!(collection)
-    do_drop_while(pointer, iterator, fun, module)
+    case O.iterator(collection) do
+      { iterator, pointer } ->
+        module = O.__impl_for__!(collection)
+        do_drop_while(pointer, iterator, fun, module)
+      list when is_list(list) ->
+        drop_while(collection, fun)
+    end
   end
 
   @doc """

      Enum.split [1,2,3], 0  #=> { [], [1,2,3] }

  """
  def split(collection, count) when count >= 0 do
    { iterator, pointer } = O.iterator(collection)
    module = O.__impl_for__!(collection)
    do_split(pointer, iterator, count, [], module)
  end

  @doc """


  ## split

  defp do_split([h|t], counter, acc) when counter > 0 do
    do_split(t, counter - 1, [h|acc])
  end

  defp do_split(list, 0, acc) do
    { List.reverse(acc), list }
  end

  defp do_split([], _, acc) do
    { List.reverse(acc), [] }
  end

  defp do_split({ h, next }, iterator, counter, acc, module) when counter > 0 do
    do_split(iterator.(next), iterator, counter - 1, [h|acc], module)
  end
