예제 #1
0
        public void Create_WithStartedIEnumerator()
        {
            string             characters = "hello";
            IEnumerator <char> enumerator = characters.GetEnumerator();

            Assert.IsTrue(enumerator.MoveNext());

            Iterator <char> iterator = Iterator.Create(enumerator);

            Assert.IsNotNull(iterator);
            Assert.IsTrue(iterator.HasStarted());
            Assert.IsTrue(iterator.HasCurrent());
            Assert.AreEqual('h', iterator.Current);
            Assert.AreEqual('h', enumerator.Current);

            foreach (char character in characters.Skip(1))
            {
                Assert.IsTrue(iterator.Next());
                Assert.IsTrue(iterator.HasStarted());
                Assert.IsTrue(iterator.HasCurrent());
                Assert.AreEqual(character, iterator.Current);
                Assert.AreEqual(character, enumerator.Current);
            }

            for (int i = 0; i < 2; ++i)
            {
                Assert.IsFalse(iterator.Next());
                Assert.IsTrue(iterator.HasStarted());
                Assert.IsFalse(iterator.HasCurrent());
                Assert.ThrowsException <PreConditionException>(() => iterator.Current);
                Assert.ThrowsException <InvalidOperationException>(() => enumerator.Current);
            }
        }
예제 #2
0
        public static ISequence <ISequence <T> > Window <T>(this ISequence <T> source, int windowSize, int queueLimit = 1)
        {
            if (queueLimit < 1)
            {
                throw new ArgumentOutOfRangeException("queueLimit must be greater that one.");
            }

            return(Create <ISequence <T> >(context =>
            {
                Task <bool> lastCopyToResult = null;
                var i = source.Start(context);
                var subscription = new RefCountDisposable(i);
                return Iterator.Create <ISequence <T> >(async(r, c) =>
                {
                    if (lastCopyToResult != null && await lastCopyToResult.ConfigureAwait(false) == false)
                    {
                        return false;
                    }

                    if (!await i.MoveNext(c).ConfigureAwait(false))
                    {
                        return false;
                    }

                    var queue = new AsyncQueue <T>(queueLimit);
                    await queue.OnNext(i.Current, c).ConfigureAwait(false);

                    r.Value = Create(context2 => new AnonymousIterator <T>(queue.MoveNext, () => queue.Current, queue.Dispose, Enumerable.Empty <Task>, context2));
                    var keepAlive = subscription.GetDisposable();
                    lastCopyToResult = CopyToQueue(i, queue, windowSize - 1, CancellationToken.None, true).Finally(keepAlive.Dispose);
                    return true;
                }, context, subscription);
            }));
        }
예제 #3
0
        /// <summary>
        /// Assert that the values in the provided IEnumerables are equal and in the same order.
        /// </summary>
        /// <typeparam name="T">The type of values to compare.</typeparam>
        /// <param name="expected">The expected values.</param>
        /// <param name="values">The values to check.</param>
        public static void AreEqual <T>(IEnumerable <T> expected, IEnumerable <T> values)
        {
            if (!object.Equals(expected, values))
            {
                if (expected == null)
                {
                    Assert.Fail("Expected the value to be null.");
                }
                else if (values == null)
                {
                    Assert.Fail("Expected the value to be non-null.");
                }
                else
                {
                    Iterator <T> valueIterator    = Iterator.Create(expected);
                    Iterator <T> expectedIterator = Iterator.Create(values);

                    int index = 0;
                    while (valueIterator.Next() & expectedIterator.Next())
                    {
                        Assert.AreEqual(valueIterator.GetCurrent(), expectedIterator.GetCurrent(), $"Values at index {index} are not equal.");
                        index++;
                    }

                    if (valueIterator.HasCurrent() || expectedIterator.HasCurrent())
                    {
                        Assert.AreEqual(expected.Count(), values.Count(), "Element counts are not equal.");
                    }
                }
            }
        }
예제 #4
0
        public void Create_WithNonEmptyIEnumerable()
        {
            string          characters = "hello";
            Iterator <char> iterator   = Iterator.Create(characters);

            Assert.IsNotNull(iterator);
            Assert.IsFalse(iterator.HasStarted());
            Assert.IsFalse(iterator.HasCurrent());

            foreach (char character in characters)
            {
                Assert.IsTrue(iterator.Next());
                Assert.IsTrue(iterator.HasStarted());
                Assert.IsTrue(iterator.HasCurrent());
                Assert.AreEqual(character, iterator.Current);
            }

            for (int i = 0; i < 2; ++i)
            {
                Assert.IsFalse(iterator.Next());
                Assert.IsTrue(iterator.HasStarted());
                Assert.IsFalse(iterator.HasCurrent());
                Assert.ThrowsException <PreConditionException>(() => iterator.Current);
            }
        }
예제 #5
0
        //public static ISequence<R> Cast<T, R>(this ISequence<T> source)
        //    where T : R
        //{
        //    return source as ISequence<R> ?? Create<R>(context =>
        //    {
        //        var iterator = source.Start(context);
        //        return Iterator.Create(iterator.MoveNext, () => (R)iterator.Current, iterator.Dispose, iterator.Stop, context);
        //    });;
        //}

        public static ISequence <T> Cast <T>(this ISequence source)
        {
            return(source as ISequence <T> ?? Create <T>(context =>
            {
                var iterator = source.Start(context);
                return Iterator.Create(iterator.MoveNext, () => { return (T)iterator.Current; }, iterator.Dispose, iterator.Stop, context);
            }));
        }
예제 #6
0
 public static ISequence <object> AsObjects(this ISequence source)
 {
     return(source as ISequence <object> ?? Create <object>(context =>
     {
         var iterator = source.Start(context);
         return Iterator.Create(iterator.MoveNext, () => iterator.Current, iterator.Dispose, iterator.Stop, context);
     }));
 }
예제 #7
0
 public static ISequence <T> Never <T>()
 {
     return(Sequence.Create <T>(context => Iterator.Create <T>(
                                    moveNext: c => c.AsTask().Then(() => TaskConstants.CanceledTask <bool>()),
                                    current: () => { throw new InvalidOperationException(); },
                                    cancel: Disposable.Empty,
                                    context: context)
                                ));
 }
예제 #8
0
            public IIterator <T> Start(int queueIndex)
            {
                EnsureReading();

                lock (gate)
                {
                    var queue = queues[queueIndex];
                    if (queue == null)
                    {
                        if (readTask != null && readTask.IsCompleted)
                        {
                            if (readTask.IsFaulted)
                            {
                                return(Sequence.Throw <T>(readTask.Exception).Start(context));
                            }
                            else if (readTask.IsCanceled)
                            {
                                return(Sequence.Throw <T>(new OperationCanceledException()).Start(context));
                            }
                            else
                            {
                                return(Sequence.Empty <T>().Start(context));
                            }
                        }

                        queue = new AsyncQueue <T>(maxQueueLength);
                        queues[queueIndex] = queue;
                    }

                    if (iterators[queueIndex] != null)
                    {
                        throw new InvalidOperationException("The broadcast target already has an active iterator.");
                    }

                    var iterator = Iterator.Create(
                        moveNext: queue.MoveNext,
                        current: () => queue.Current,
                        cancel: () =>
                    {
                        lock (gate)
                        {
                            iterators[queueIndex] = null;
                            if (queue != null)
                            {
                                queue.Dispose();
                                queues[queueIndex] = null;
                            }
                        }
                    },
                        stop: Stop,
                        context: context
                        );

                    iterators[queueIndex] = iterator;
                    return(iterator);
                }
            }
예제 #9
0
        public static int TestNextByteArray(byte[] a)
        {
            int sum      = 0;
            var iterator = Iterator.Create <byte>(a);

            while (iterator.Next())
            {
                sum += iterator.Value;
            }

            return(sum);
        }
예제 #10
0
        public static int TestNextIntArrayForeach(int[] a)
        {
            int sum      = 0;
            var iterator = Iterator.Create <int>(a);

            foreach (var value in iterator)
            {
                sum += value;
            }

            return(sum);
        }
예제 #11
0
        public static int TestNextIntArrayBase(int[] a)
        {
            int sum      = 0;
            var iterator = (Iterator)Iterator.Create <int>(a);

            while (iterator.Next())
            {
                sum += (int)iterator.Value;
            }

            return(sum);
        }
예제 #12
0
        public static int TestNextIntArray(int[] a)
        {
            int sum      = 0;
            var iterator = Iterator <int, int> .Create(a);

            while (iterator.Next())
            {
                sum += iterator.Value;
            }

            return(sum);
        }
예제 #13
0
        public void Create_WithEmptyIEnumerable()
        {
            Iterator <char> iterator = Iterator.Create("");

            Assert.IsFalse(iterator.HasStarted());
            Assert.IsFalse(iterator.HasCurrent());

            for (int i = 0; i < 2; ++i)
            {
                Assert.IsFalse(iterator.Next());
                Assert.IsTrue(iterator.HasStarted());
                Assert.IsFalse(iterator.HasCurrent());
            }
        }
예제 #14
0
        public static int TestConcatArray(byte[] a, byte[] b)
        {
            int sum       = 0;
            var iteratorA = Iterator <byte, byte> .Create(a);

            var iteratorB = Iterator <byte, byte> .Create(b);

            var iteratorC = iteratorA.Concat(iteratorB);

            while (iteratorC.Next())
            {
                sum += iteratorC.Value;
            }

            return(sum);
        }
예제 #15
0
        public static int TestConcatMap(Map <byte, byte> a, Map <byte, byte> b)
        {
            int sum       = 0;
            var iteratorA = Iterator <byte, byte> .Create(a);

            var iteratorB = Iterator <byte, byte> .Create(b);

            var iteratorC = iteratorA.Concat(iteratorB);

            while (iteratorC.Next())
            {
                sum += iteratorC.Key;
                sum += iteratorC.Value;
            }

            return(sum);
        }
예제 #16
0
        public static int TestConcatValues(Map <byte, byte> a, Map <byte, byte> b)
        {
            int sum       = 0;
            var iteratorA = Iterator <byte, byte> .Create(a);

            var iteratorB = Iterator <byte, byte> .Create(b);

            var iteratorC  = iteratorA.Concat(iteratorB);
            var enumerator = iteratorC.Values;

            while (enumerator.Next())
            {
                sum += enumerator.Value;
            }

            return(sum);
        }
예제 #17
0
        public static ISequence <T> CreateProducer <T>(Func <IAsyncObserver <T>, CancellationToken, Task> producer, int queueLimit)
        {
            return(Create(context =>
            {
                var cts = new CancellationTokenSource();
                var queue = new AsyncQueue <T>(queueLimit);

                var task = producer(queue, cts.Token)
                           .ContinueWith(t => queue.OnError(t.Exception), TaskContinuationOptions.OnlyOnFaulted);

                return Iterator.Create(
                    moveNext: queue.MoveNext,
                    current: () => queue.Current,
                    cancel: cts.Cancel,
                    stop: () => EnumerableEx.Return(task),
                    context: context
                    );
            }));
        }
예제 #18
0
        public void Create_WithFinishedIEnumerator()
        {
            string             characters = "";
            IEnumerator <char> enumerator = characters.GetEnumerator();

            Assert.IsFalse(enumerator.MoveNext());

            Iterator <char> iterator = Iterator.Create(enumerator);

            Assert.IsNotNull(iterator);
            Assert.IsTrue(iterator.HasStarted());
            Assert.IsFalse(iterator.HasCurrent());
            Assert.ThrowsException <PreConditionException>(() => iterator.Current);
            Assert.ThrowsException <InvalidOperationException>(() => enumerator.Current);

            for (int i = 0; i < 2; ++i)
            {
                Assert.IsFalse(iterator.Next());
                Assert.IsTrue(iterator.HasStarted());
                Assert.IsFalse(iterator.HasCurrent());
                Assert.ThrowsException <PreConditionException>(() => iterator.Current);
                Assert.ThrowsException <InvalidOperationException>(() => enumerator.Current);
            }
        }
예제 #19
0
        public static object GetIterator()
        {
            var iteratorA = Iterator <BigInteger, BigInteger> .Create(new BigInteger[] { -10 });

            return(iteratorA);
        }
예제 #20
0
 public void Create_WithNullIEnumerator()
 {
     Assert.ThrowsException <PreConditionException>(() => Iterator.Create((IEnumerator <char>)null));
 }
예제 #21
0
        public static object IteratorTest(byte[] a, byte[] b)
        {
            int sum      = 0;
            var iterator = Iterator <byte, byte> .Create(a);

            while (iterator.Next())
            {
                sum += iterator.Value;
            }
            OnNotify("aa", sum);


            sum = 1;
            var iteratorA = Iterator <byte, byte> .Create(a);

            var iteratorB = Iterator <byte, byte> .Create(b);

            var iteratorC = iteratorA.Concat(iteratorB);

            while (iteratorC.Next())
            {
                sum += iteratorC.Key;
                sum += iteratorC.Value;
            }
            OnNotify(sum);

            Map <byte, byte> map = new Map <byte, byte>();

            map[2]  = 12;
            map[0]  = 24;
            map[1]  = 10;
            map[12] = 36;

            Map <byte, byte> map1 = new Map <byte, byte>();

            map1[2]  = 12;
            map1[0]  = 24;
            map1[1]  = 10;
            map1[12] = 36;

            sum = 0;
            var iteratorD = Iterator <byte, byte> .Create(map);

            var iteratorE = Iterator <byte, byte> .Create(map1);

            var iteratorF  = iteratorD.Concat(iteratorE);
            var enumerator = iteratorF.Keys;

            while (enumerator.Next())
            {
                sum += enumerator.Value;
            }
            OnNotify(sum);//30

            sum = 0;

            var iteratorH = Iterator <byte, byte> .Create(map);

            var iteratorI = Iterator <byte, byte> .Create(map1);

            var iteratorG   = iteratorH.Concat(iteratorI);
            var enumeratorV = iteratorG.Values;

            while (enumeratorV.Next())
            {
                sum += enumeratorV.Value;
            }
            OnNotify(sum);//164

            OnNotify(iteratorA);

            OnNotify(iteratorA.Values);

            OnNotify(iteratorA.Keys);

            return(iteratorA.Keys);
        }
예제 #22
0
 public static ISequence <T> Create <T>(Func <IObserver <T>, CancellationToken, Task> start)
 {
     return(Create(context => Iterator.Create(start, context)));
 }