BlockingCollectionPartitioner<T>
using System;
using System.Collections.Concurrent;
using System.Collections.Generic;
using System.Linq;
using System.Threading;
namespace Relativity.Transfer
{
internal class BlockingCollectionPartitioner<T> : Partitioner<T>
{
private readonly BlockingCollection<T> collection;
private readonly CancellationToken token;
public override bool SupportsDynamicPartitions => true;
internal BlockingCollectionPartitioner(BlockingCollection<T> collection, CancellationToken token)
{
if (collection == null)
throw new ArgumentNullException("collection");
this.token = token;
this.collection = collection;
}
public override IList<IEnumerator<T>> GetPartitions(int partitionCount)
{
if (partitionCount < 1)
throw new ArgumentOutOfRangeException("partitionCount");
IEnumerable<T> dynamicPartitioner = GetDynamicPartitions();
return Enumerable.ToArray<IEnumerator<T>>(Enumerable.Select<int, IEnumerator<T>>(Enumerable.Range(0, partitionCount), (Func<int, IEnumerator<T>>)((int _) => dynamicPartitioner.GetEnumerator())));
}
public override IEnumerable<T> GetDynamicPartitions()
{
return collection.GetConsumingEnumerable(token);
}
}
}