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

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

  @doc """


  ## drop_while

  defp do_drop_while([h|t], fun) do
    case fun.(h) do
      x in [false, nil] -> [h|t]
      _ -> do_drop_while(t, fun)
    end
  end

  defp do_drop_while([], _) do
    []
  end

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

