 
   """
   @spec drop(t, integer) :: list
-  def drop(enumerable, n) when is_list(enumerable) and n >= 0 do
+  def drop(enumerable, n) when is_list(enumerable) and is_integer(n) and n >= 0 do
     do_drop(enumerable, n)
   end
 
-  def drop(enumerable, n) when n >= 0 do
+  def drop(enumerable, n) when is_integer(n) and n >= 0 do
     res =
       reduce(enumerable, n, fn
         x, acc when is_list(acc) -> [x | acc]


  def drop_every(_enumerable, 1), do: []
  def drop_every(enumerable, 0), do: to_list(enumerable)
  def drop_every([], _nth), do: []

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

    if is_list(res), do: :lists.reverse(res), else: []
  end

  def drop(enumerable, n) when is_integer(n) and n < 0 do
    do_drop(reverse(enumerable), abs(n)) |> :lists.reverse
  end

