   tuple with two lists, each of which is formed by the first and second element
   of each tuple, respectively.
 
-  This function fails unless `coll` is or can be converted into a list of
+  This function fails unless `collection` is or can be converted into a list of
   tuples with *exactly* two elements in each tuple.
 
   ## Examples


  """
  @spec zip(t, t) :: [{any, any}]
  def zip(coll1, coll2) when is_list(coll1) and is_list(coll2) do
    do_zip(coll1, coll2)
  end

  def zip(coll1, coll2) do
    Stream.zip(coll1, coll2).({:cont, []}, &{:cont, [&1|&2]}) |> elem(1) |> :lists.reverse
  end

  @doc """


  """
  @spec slice(t, Range.t) :: list
  def slice(collection, first..last) when first >= 0 and last >= 0 do
    # Simple case, which works on infinite collections
    if last - first >= 0 do
      slice(collection, first, last - first + 1)
    else
      []
    end
  end

  def slice(collection, first..last) do
    {list, count} = enumerate_and_count(collection, 0)
    corr_first = if first >= 0, do: first, else: first + count
    corr_last = if last >= 0, do: last, else: last + count
    length = corr_last - corr_first + 1
