         end
       end)
 
-    do_take_last(buf1, buf2, count, [])
-  end
-
-  defp do_take_last(_buf1, _buf2, 0, acc),
+    take_last(buf1, buf2, count, [])
+  end
+
+  defp take_last(_buf1, _buf2, 0, acc),
     do: acc
-  defp do_take_last([], [], _, acc),
+  defp take_last([], [], _, acc),
     do: acc
-  defp do_take_last([], [h | t], count, acc),
-    do: do_take_last([], t, count - 1, [h | acc])
-  defp do_take_last([h | t], buf2, count, acc),
-    do: do_take_last(t, buf2, count - 1, [h | acc])
+  defp take_last([], [head | tail], count, acc),
+    do: take_last([], tail, count - 1, [head | acc])
+  defp take_last([head | tail], buf2, count, acc),
+    do: take_last(tail, buf2, count - 1, [head | acc])
 
   @doc """
   Returns a list of every `nth` item in the enumerable,

  """
  @spec split_while(t, (element -> as_boolean(term))) :: {list, list}
  def split_while(enumerable, fun) when is_list(enumerable) do
    do_split_while(enumerable, fun, [])
  end

  def split_while(enumerable, fun) do

  @spec zip(t, t) :: [{any, any}]
  def zip(enumerable1, enumerable2)
      when is_list(enumerable1) and is_list(enumerable2) do
    zip_list(enumerable1, enumerable2)
  end

  def zip(enumerable1, enumerable2) do
