public static IRequestProgressObservable <IEnumerable <TItem>, TResponse> RequestProgress <TResponse, TItem>(
            this ILanguageProtocolProxy requestRouter, IPartialItemsRequest <TResponse, TItem> @params, Func <IEnumerable <TItem>, TResponse> factory,
            CancellationToken cancellationToken = default
            )
            where TResponse : IEnumerable <TItem>
        {
            var resultToken = new ProgressToken(Guid.NewGuid().ToString());

            @params.PartialResultToken = resultToken;

            return(requestRouter.ProgressManager.MonitorUntil(@params, factory, cancellationToken));
        }
        public IRequestProgressObservable <TItem> MonitorUntil <TItem>(IPartialItemsRequest <TItem> request, CancellationToken cancellationToken)
        {
            request.PartialResultToken ??= new ProgressToken(Guid.NewGuid().ToString());
            if (_activeObservables.TryGetValue(request.PartialResultToken, out var o) && o is IRequestProgressObservable <TItem> observable)
            {
                return(observable);
            }

            observable = new PartialItemsRequestProgressObservable <TItem>(_serializer, request.PartialResultToken, MakeRequest(request), x => new Container <TItem>(x), cancellationToken,
                                                                           () => _activeObservables.TryRemove(request.PartialResultToken, out var disposable));
            _activeObservables.TryAdd(request.PartialResultToken, observable);
            return(observable);
        }
        public IProgressObserver <IEnumerable <TItem> > For <TResponse, TItem>(IPartialItemsRequest <TResponse, TItem> request, CancellationToken cancellationToken)
            where TResponse : IEnumerable <TItem>
        {
            if (request.PartialResultToken == null)
            {
                return(ProgressObserver <IEnumerable <TItem> > .Noop);
            }
            if (_activeObservers.TryGetValue(request.PartialResultToken, out var o) && o is IProgressObserver <IEnumerable <TItem> > observer)
            {
                return(observer);
            }

            observer = new ProgressObserver <IEnumerable <TItem> >(request.PartialResultToken, _router, _serializer, cancellationToken, () => _activeObservers.TryRemove(request.PartialResultToken, out var disposable));
            _activeObservers.TryAdd(request.PartialResultToken, observer);
            return(observer);
        }
        public IRequestProgressObservable <IEnumerable <TItem>, TResponse> MonitorUntil <TResponse, TItem>(
            IPartialItemsRequest <TResponse, TItem> request,
            Func <IEnumerable <TItem>, TResponse> factory, CancellationToken cancellationToken
            )
            where TResponse : IEnumerable <TItem>
        {
            request.PartialResultToken ??= new ProgressToken(Guid.NewGuid().ToString());
            if (_activeObservables.TryGetValue(request.PartialResultToken, out var o) && o is IRequestProgressObservable <IEnumerable <TItem>, TResponse> observable)
            {
                return(observable);
            }

            observable = new PartialItemsRequestProgressObservable <TItem, TResponse>(
                _serializer, request.PartialResultToken, MakeRequest(request), factory, cancellationToken,
                () => _activeObservables.TryRemove(request.PartialResultToken, out var disposable)
                );
            _activeObservables.TryAdd(request.PartialResultToken, observable);
            return(observable);
        }
        public IRequestProgressObservable <IEnumerable <TItem>, IEnumerable <TItem> > MonitorUntil <TItem>(
            IPartialItemsRequest <IEnumerable <TItem>, TItem> request,
            CancellationToken cancellationToken
            )
        {
            request.SetPartialResultToken();
            if (_activeObservables.TryGetValue(request.PartialResultToken !, out var o) && o is IRequestProgressObservable <IEnumerable <TItem>, IEnumerable <TItem> > observable)
            {
                return(observable);
            }

            observable = new PartialItemsRequestProgressObservable <TItem, IEnumerable <TItem> >(
                _serializer,
                request.PartialResultToken,
                MakeRequest(request),
                x => x,
                cancellationToken,
                () => _activeObservables.TryRemove(request.PartialResultToken, out _)
                );
            _activeObservables.TryAdd(request.PartialResultToken, observable);
            return(observable);
        }
 public IRequestProgressObservable <IEnumerable <TItem>, TResponse> MonitorUntil <TResponse, TItem>(
     IPartialItemsRequest <TResponse, TItem> request,
     Func <IEnumerable <TItem>, TResponse> factory, CancellationToken cancellationToken
     )
     where TResponse : IEnumerable <TItem>?
 {