public Task ReleaseRemovedAsync(ModuleIdentifier module,
                                        ModuleVersion version,
                                        IDependencyResolver dependencyResolver, // TODO: This should be injected via DI
                                        CancellationToken cancellation = default)
        {
            if (module == default)
            {
                throw new ArgumentDefaultException(nameof(module));
            }

            // TODO: Is this ok?
            if (!ResolvedModules.ContainsModule(module))
            {
                return(Task.CompletedTask);
            }

            return(ResolveDependenciesAsync(dependencyResolver, cancellation));
        }
        public Task ReleaseAddedAsync(ModuleIdentifier module,
                                      ModuleVersion version,
                                      IDependencyResolver dependencyResolver, // TODO: This should be injected via DI
                                      CancellationToken cancellation = default)
        {
            if (module == default)
            {
                throw new ArgumentDefaultException(nameof(module));
            }

            // We must update if the resolved installation set contains our module
            // -- OR --
            // The unresolved installation set is non-epty but we were unable to get to a resolved installation set (f.e. due to missing module-releases)
            if (ResolvedModules.ContainsModule(module) || InstalledModules.Unresolved.Any() && !ResolvedModules.Resolved.Any())
            {
                return(ResolveDependenciesAsync(dependencyResolver, cancellation));
            }

            return(Task.CompletedTask);
        }