public TextLinesParallelProcessingFilter(IPipe <LineProcessingContext> lineProcessingPipe, ConcurrencySettings settings)
 {
     _lineProcessingPipe = lineProcessingPipe;
     _settings           = settings;
     _processLine        = new ActionBlock <LineProcessingContext>(
         context => _lineProcessingPipe.Send(context),
         new ExecutionDataflowBlockOptions
     {
         BoundedCapacity        = 1,
         EnsureOrdered          = false,
         MaxDegreeOfParallelism = _settings.DegreeOfParallelism
     });
 }
        /// <summary>
        /// Creates three lists (one for each concurrency type) which contain all the offers
        ///  which have been applied to the given transaction.
        /// </summary>
        /// <param name="retailTransaction">Transaction to collect offers from</param>
        /// <param name="sortedExclusiveOffers">List of all exclusive offers</param>
        /// <param name="sortedBestPriceOffers">List of all best price offers</param>
        /// <param name="sortedConcurrentOffers">List of all compound offers</param>
        private static void InitializeOfferLists(RetailTransaction retailTransaction,
                                                 out List <OfferGroup> sortedExclusiveOffers,
                                                 out List <OfferGroup> sortedBestPriceOffers,
                                                 out List <OfferGroup> sortedConcurrentOffers)
        {
            sortedExclusiveOffers  = new List <OfferGroup>();
            sortedBestPriceOffers  = new List <OfferGroup>();
            sortedConcurrentOffers = new List <OfferGroup>();
            List <OfferGroup> sortedAllConcurrentOffers = new List <OfferGroup>();

            var concurrencyForGroup = ConcurrencySettingsPerOfferGroup(retailTransaction);

            foreach (OfferGroup offerGroup in concurrencyForGroup.Keys)
            {
                ConcurrencySettings settings = concurrencyForGroup[offerGroup];
                switch (settings.ConcurrencyMode)
                {
                case ConcurrencyMode.Exclusive:
                    sortedExclusiveOffers.Add(offerGroup);
                    break;

                case ConcurrencyMode.BestPrice:
                    sortedBestPriceOffers.Add(offerGroup);
                    break;

                case ConcurrencyMode.Compounded:
                    sortedAllConcurrentOffers.Add(offerGroup);
                    if (!concurrencyForGroup[offerGroup].IsCompoundable)
                    {
                        sortedConcurrentOffers.Add(offerGroup);
                    }
                    break;
                }
            }

            // If there are best price discounts, compounded discounts count as best price discounts
            if (sortedBestPriceOffers.Count > 0)
            {
                sortedBestPriceOffers.AddRange(sortedAllConcurrentOffers);
            }
        }
 public TextProcessingPipeBuilder(IInputProvider input, ILineProcessingPipeBuilder lineProcessingPipeBuilder, IOptions <ConcurrencySettings> settings)
 {
     _input = input;
     _lineProcessingPipeBuilder = lineProcessingPipeBuilder;
     _settings = settings.Value;
 }