private Task <(bool isComplete, IEnumerable <string> items)> ProducePublishedProviderIds(CancellationToken token,
                                                                                                 dynamic context)
        {
            PublishedProviderFundingCsvDataProcessorContext countContext = (PublishedProviderFundingCsvDataProcessorContext)context;

            while (countContext.HasPages)
            {
                return(Task.FromResult((false, countContext.NextPage().AsEnumerable())));
            }

            return(Task.FromResult((true, ArraySegment <string> .Empty.AsEnumerable())));
        }
        private async Task GetFundingForPublishedProviderIds(CancellationToken cancellationToken,
                                                             dynamic context,
                                                             IEnumerable <string> items)
        {
            PublishedProviderFundingCsvDataProcessorContext countContext = (PublishedProviderFundingCsvDataProcessorContext)context;

            IEnumerable <PublishedProviderFundingCsvData> fundings = await _publishedFundingPolicy.ExecuteAsync(() => _publishedFunding.GetPublishedProvidersFundingDataForCsvReport(items,
                                                                                                                                                                                     countContext.SpecificationId,
                                                                                                                                                                                     countContext.Statuses));

            countContext.AddFundings(fundings);
        }
        public async Task <IEnumerable <PublishedProviderFundingCsvData> > GetFundingData(IEnumerable <string> publishedProviderIds,
                                                                                          string specificationId,
                                                                                          params PublishedProviderStatus[] statuses)
        {
            Guard.IsNullOrWhiteSpace(specificationId, nameof(specificationId));
            Guard.IsNotEmpty(publishedProviderIds, nameof(publishedProviderIds));
            Guard.IsNotEmpty(statuses, nameof(statuses));

            PublishedProviderFundingCsvDataProcessorContext context = new PublishedProviderFundingCsvDataProcessorContext(publishedProviderIds,
                                                                                                                          statuses,
                                                                                                                          specificationId);

            IProducerConsumer producerConsumer = _producerConsumerFactory.CreateProducerConsumer(ProducePublishedProviderIds,
                                                                                                 GetFundingForPublishedProviderIds,
                                                                                                 20,
                                                                                                 5,
                                                                                                 _logger);

            await producerConsumer.Run(context);

            return(context.GetData());
        }