     if is_list(res), do: :lists.reverse(res), else: []
   end
 
-  def drop(enumerable, n) when n < 0 do
+  def drop(enumerable, n) when is_integer(n) and n < 0 do
     do_drop(reverse(enumerable), abs(n)) |> :lists.reverse
   end
 


  """
  @spec drop(t, integer) :: list
  def drop(enumerable, n) when is_list(enumerable) and n >= 0 do
    do_drop(enumerable, n)
  end

  def drop(enumerable, n) when n >= 0 do
    res =
      reduce(enumerable, n, fn
        x, acc when is_list(acc) -> [x | acc]


  def take_every(enumerable, 1), do: to_list(enumerable)
  def take_every(_enumerable, 0), do: []
  def take_every([], nth) when is_integer(nth) and nth > 1, do: []

  def take_every(enumerable, nth) when is_integer(nth) and nth > 1 do
    {res, _} = reduce(enumerable, {[], :first}, R.take_every(nth))
    :lists.reverse(res)
  end
