public static ProgressObserver <WorkDoneProgressReport> CreateWorkDoneProgress(
            IResponseRouter router,
            ISerializer serializer,
            WorkDoneProgressBegin begin, Func <Exception, WorkDoneProgressEnd> onError,
            Func <WorkDoneProgressEnd> onComplete,
            CancellationToken cancellationToken)
        {
            var token       = new ProgressToken(Guid.NewGuid().ToString());
            var earlyEvents = new AsyncSubject <List <WorkDoneProgress> >();
            var observer    = new Subject <WorkDoneProgress>();
            var disposable  = new CompositeDisposable {
                observer, earlyEvents
            };

            var worker = CreateWorker <WorkDoneProgress>(token, router, serializer, onError, onComplete, disposable);

            disposable.Add(
                observer
                .Scan(new List <WorkDoneProgress>()
            {
                begin
            }, (acc, v) =>
            {
                acc.Add(v);
                return(acc);
            })
                .Subscribe(earlyEvents.OnNext)
                );

            disposable.Add(
                Observable.FromAsync(ct => router.CreateProgress(token, ct))
                .Subscribe(_ => { }, e => { }, () => { earlyEvents.OnCompleted(); })
                );

            disposable.Add(
                earlyEvents
                .SelectMany(z => z)
                .Concat(observer)
                .Subscribe(worker)
                );

            return(new ProgressObserver <WorkDoneProgressReport>(token, observer,
                                                                 CancellationTokenSource.CreateLinkedTokenSource(cancellationToken)));
        }