       do_zip mlist, [list_to_tuple(:lists.reverse(heads))|acc]
     end
   end
+
+  defp do_zip_each(_, nil) do
+    { nil, nil }
+  end
+
+  defp do_zip_each([h|t], acc) do
+    { t, [h|acc] }
+  end
+
+  defp do_zip_each([], _) do
+    { nil, nil }
+  end
+
+  defp to_list(tuple) when is_tuple(tuple), do: tuple_to_list(tuple)
+  defp to_list(list)  when is_list(list),   do: list
 end

  end

  defp do_zip(list, acc) do
    list = :lists.map fn(list_or_tuple) ->
      case is_tuple(list_or_tuple) do
      match: true
        tuple_to_list list_or_tuple
      else:
        list_or_tuple
      end
    end, list

    {mlist, heads} =
      :lists.mapfoldl (fn do
      match: _, nil
        {nil, nil}
      match: [h|t], acc
        {t, [h|acc]}
      match: [], _
        {nil, nil}
      end), [], list

    case heads do
    match: nil

      #=> [{1, 4}, {2, 5}]

  """
  def zip(item1, item2) do
    do_zip(to_list(item1), to_list(item2), [])
  end

  @doc """
