         {acc, rest, lock} =
           all(t, [dep | acc], upper_breadths, current_breadths, callback, rest, lock, env, cache)
 
-        deps = reject_non_fullfilled_optional(dep.deps, Enum.map(acc, & &1.app))
+        deps = reject_non_fulfilled_optional(dep.deps, Enum.map(acc, & &1.app))
         new_breadths = Enum.map(deps, &(&1.app)) ++ current_breadths
         all(deps, acc, current_breadths, new_breadths, callback, rest, lock, env, cache)
     end

    Enum.all?(keys, &(Keyword.fetch(opts1, &1) == Keyword.fetch(opts2, &1)))
  end

  defp reject_non_fullfilled_optional(deps) do
    apps = Enum.map(deps, & &1.app)
    for dep <- deps do
      update_in dep.deps, &reject_non_fullfilled_optional(&1, apps)
    end
  end

  defp reject_non_fullfilled_optional(children, upper_breadths) do
    Enum.reject children, fn %Mix.Dep{app: app, opts: opts} ->
      opts[:optional] && not(app in upper_breadths)
    end

          end
        end)

      {reject_non_fulfilled_optional(deps), rest, lock}
    else
      {reject_non_fulfilled_optional(deps), rest, lock}
    end
  end

