         other -> other
       end)
 
-    {{:\\, [], [left, right]}, acc}
+    {{:\\, [], [left, right]}, counters}
   end
 
   # If the variable is being used explicitly for naming,
   # we always give it a higher priority (nil) even if it
   # starts with underscore.
-  defp simplify_arg({:=, _, [{var, _, atom}, _]}, acc, _env) when is_atom(atom) do
-    {simplify_var(var, nil), acc}
-  end
-
-  defp simplify_arg({:=, _, [_, {var, _, atom}]}, acc, _env) when is_atom(atom) do
-    {simplify_var(var, nil), acc}
+  defp simplify_arg({:=, _, [{var, _, atom}, _]}, counters, _env) when is_atom(atom) do
+    {simplify_var(var, nil), counters}
+  end
+
+  defp simplify_arg({:=, _, [_, {var, _, atom}]}, counters, _env) when is_atom(atom) do
+    {simplify_var(var, nil), counters}
   end
 
   # If we have only the variable as argument, it also gets
   # higher priority. However, if the variable starts with an
   # underscore, we give it a secondary context (Elixir) with
   # lower priority.
-  defp simplify_arg({var, _, atom}, acc, _env) when is_atom(atom) do
-    {simplify_var(var, Elixir), acc}
-  end
-
-  defp simplify_arg({:%, _, [left, _]}, acc, env) do
+  defp simplify_arg({var, _, atom}, counters, _env) when is_atom(atom) do
+    {simplify_var(var, Elixir), counters}
+  end
+
+  defp simplify_arg({:%, _, [left, _]}, counters, env) do
     case Macro.expand_once(left, env) do
-      module when is_atom(module) -> autogenerated_key(acc, simplify_module_name(module))
-      _ -> autogenerated_key(acc, :struct)
-    end
-  end
-
-  defp simplify_arg({:%{}, _, _}, acc, _env) do
-    autogenerated_key(acc, :map)
-  end
-
-  defp simplify_arg({:@, _, _} = attr, acc, env) do
-    simplify_arg(Macro.expand_once(attr, env), acc, env)
-  end
-
-  defp simplify_arg(other, acc, _env) when is_integer(other), do: autogenerated_key(acc, :int)
-  defp simplify_arg(other, acc, _env) when is_boolean(other), do: autogenerated_key(acc, :bool)
-  defp simplify_arg(other, acc, _env) when is_atom(other), do: autogenerated_key(acc, :atom)
-  defp simplify_arg(other, acc, _env) when is_list(other), do: autogenerated_key(acc, :list)
-  defp simplify_arg(other, acc, _env) when is_float(other), do: autogenerated_key(acc, :float)
-  defp simplify_arg(other, acc, _env) when is_binary(other), do: autogenerated_key(acc, :binary)
-  defp simplify_arg(_, acc, _env), do: autogenerated_key(acc, :arg)
+      module when is_atom(module) -> autogenerated_key(counters, simplify_module_name(module))
+      _ -> autogenerated_key(counters, :struct)
+    end
+  end
+
+  defp simplify_arg({:%{}, _, _}, counters, _env) do
+    autogenerated_key(counters, :map)
+  end
+
+  defp simplify_arg({:@, _, _} = attr, counters, env) do
+    simplify_arg(Macro.expand_once(attr, env), counters, env)
+  end
+
+  defp simplify_arg(other, counters, _env) when is_integer(other),
+    do: autogenerated_key(counters, :int)
+
+  defp simplify_arg(other, counters, _env) when is_boolean(other),
+    do: autogenerated_key(counters, :bool)
+
+  defp simplify_arg(other, counters, _env) when is_atom(other),
+    do: autogenerated_key(counters, :atom)
+
+  defp simplify_arg(other, counters, _env) when is_list(other),
+    do: autogenerated_key(counters, :list)
+
+  defp simplify_arg(other, counters, _env) when is_float(other),
+    do: autogenerated_key(counters, :float)
+
+  defp simplify_arg(other, counters, _env) when is_binary(other),
+    do: autogenerated_key(counters, :binary)
+
+  defp simplify_arg(_, counters, _env), do: autogenerated_key(counters, :arg)
 
   defp simplify_var(var, guess_priority) do
     case Atom.to_string(var) do

    end
  end

  defp autogenerated_key(acc, key) do
    case acc do
      %{^key => :once} -> {key, Map.put(acc, key, 2)}
      %{^key => value} -> {key, Map.put(acc, key, value + 1)}
      %{} -> {key, Map.put(acc, key, :once)}
    end
  end


    {reverse_args, counters}
  end

  defp simplify_arg({:\\, _, [left, right]}, counters, env) do
    {left, counters} = simplify_arg(left, counters, env)

    right =
      Macro.prewalk(right, fn
