| 12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879 | // Copyright (c) Microsoft Open Technologies, Inc. All rights reserved. See License.txt in the project root for license information.#if NO_CDS || NO_PERFusing System.Collections.Generic;namespace System.Reactive{    sealed class PushPullAdapter<T, R> : IObserver<T>, IEnumerator<R>    {        Action<Notification<T>> yield;        Action dispose;        Func<Notification<R>> moveNext;        Notification<R> current;        bool done = false;        bool disposed;        public PushPullAdapter(Action<Notification<T>> yield, Func<Notification<R>> moveNext, Action dispose)        {            this.yield = yield;            this.moveNext = moveNext;            this.dispose = dispose;        }        public void OnNext(T value)        {            yield(Notification.CreateOnNext<T>(value));        }        public void OnError(Exception exception)        {            yield(Notification.CreateOnError<T>(exception));            dispose();        }        public void OnCompleted()        {            yield(Notification.CreateOnCompleted<T>());            dispose();        }        public R Current        {            get { return current.Value; }        }        public void Dispose()        {            disposed = true;            dispose();        }        object System.Collections.IEnumerator.Current        {            get { return this.Current; }        }        public bool MoveNext()        {            if (disposed)                throw new ObjectDisposedException("");            if (!done)            {                current = moveNext();                done = current.Kind != NotificationKind.OnNext;            }            current.Exception.ThrowIfNotNull();            return current.HasValue;        }        public void Reset()        {            throw new NotSupportedException();        }    }}#endif
 |