     {map1, map2} = order_by_size(map1, map2)
 
     map1
-    |> Map.keys()
+    |> :maps.iterator()
+    |> :maps.next()
     |> none_in?(map2)
   end
 
-  defp none_in?([], _) do
-    true
-  end
-
-  defp none_in?([key | rest], map2) do
-    case map2 do
-      %{^key => _} -> false
-      _ -> none_in?(rest, map2)
-    end
+  defp none_in?(:none, _), do: true
+
+  defp none_in?({key, _val, iter}, map2) do
+    not :erlang.is_map_key(key, map2) and none_in?(:maps.next(iter), map2)
   end
 
   @doc """

  """
  @spec subset?(t, t) :: boolean
  def subset?(%MapSet{map: map1}, %MapSet{map: map2}) do
    if map_size(map1) <= map_size(map2) do
      map1
      |> Map.keys()
      |> map_subset?(map2)
    else
      false
    end
  end

  defp map_subset?([], _), do: true

  defp map_subset?([key | rest], map2) do
    match?(%{^key => _}, map2) and map_subset?(rest, map2)
  end

  @doc """

  # Elixir v1.5 change the map representation, so on
  # version mismatch we need to compare the keys directly.
  def equal?(%MapSet{map: map1}, %MapSet{map: map2}) do
    map_size(map1) == map_size(map2) and all_in?(map1, map2)
  end

  @doc """
