예제 #1
0
        /// <inheritDoc/>
        public void Subscribe(ISubscriber <T> s)
        {
            PublishSubscription ps = new PublishSubscription(s, this);

            s.OnSubscribe(ps);

            if (subscribers.Add(ps))
            {
                if (ps.IsCancelled())
                {
                    subscribers.Remove(ps);
                }
                else
                {
                    Drain();
                }
            }
            else
            {
                var ex = error;
                if (ex != null)
                {
                    EmptySubscription <T> .Error(s, ex);
                }
                else
                {
                    EmptySubscription <T> .Complete(s);
                }
            }
        }
        public void Subscribe(ISubscriber <R> s)
        {
            IEnumerator <U> enumerator;

            bool hasValue;

            try
            {
                enumerator = other.GetEnumerator();

                hasValue = enumerator.MoveNext();
            }
            catch (Exception ex)
            {
                ExceptionHelper.ThrowIfFatal(ex);
                EmptySubscription <R> .Error(s, ex);

                return;
            }

            if (!hasValue)
            {
                EmptySubscription <R> .Complete(s);

                return;
            }

            var parent = new ZipEnumerableSubscriber(s, enumerator, zipper);

            source.Subscribe(parent);
        }
        public void Subscribe(ISubscriber <T> s)
        {
            try
            {
                action();
            }
            catch (Exception ex)
            {
                ExceptionHelper.ThrowIfFatal(ex);
                EmptySubscription <T> .Error(s, ex);

                return;
            }
            EmptySubscription <T> .Complete(s);
        }
예제 #4
0
        public void Subscribe(ISubscriber <T> s)
        {
            IEnumerator <IPublisher <T> > enumerator;

            bool hasValue;

            try
            {
                enumerator = sources.GetEnumerator();

                hasValue = enumerator.MoveNext();
            }
            catch (Exception ex)
            {
                ExceptionHelper.ThrowIfFatal(ex);
                EmptySubscription <T> .Error(s, ex);

                return;
            }

            if (!hasValue)
            {
                EmptySubscription <T> .Complete(s);

                return;
            }

            if (s is IConditionalSubscriber <T> )
            {
                ConcatConditionalSubscriber parent = new ConcatConditionalSubscriber((IConditionalSubscriber <T>)s, enumerator, delayError);
                s.OnSubscribe(parent);

                parent.Drain();
            }
            else
            {
                ConcatSubscriber parent = new ConcatSubscriber(s, enumerator, delayError);
                s.OnSubscribe(parent);

                parent.Drain();
            }
        }
        public void Subscribe(ISubscriber <T> s)
        {
            int n;

            IPublisher <T>[] a;

            if (!MultiSourceHelper.ToArray(sources, sourcesEnumerable, s, out n, out a))
            {
                return;
            }

            if (n == 0)
            {
                EmptySubscription <T> .Complete(s);

                return;
            }
            else
            if (n == 1)
            {
                a[0].Subscribe(s);
                return;
            }

            if (s is IConditionalSubscriber <T> )
            {
                AmbConditionalSubscription parent = new AmbConditionalSubscription((IConditionalSubscriber <T>)s, n);

                s.OnSubscribe(parent);

                parent.Subscribe(a, n);
            }
            else
            {
                AmbSubscription parent = new AmbSubscription(s, n);

                s.OnSubscribe(parent);

                parent.Subscribe(a, n);
            }
        }
예제 #6
0
        public void Subscribe(ISubscriber <R> s)
        {
            int n;

            IPublisher <T>[] a;

            if (!MultiSourceHelper.ToArray(sources, sourcesEnumerable, s, out n, out a))
            {
                return;
            }

            if (n == 0)
            {
                EmptySubscription <R> .Complete(s);

                return;
            }
            else
            if (n == 1)
            {
                new PublisherMap <T, R>(a[0], v => combiner(new T[] { v })).Subscribe(s);
                return;
            }

            if (s is IConditionalSubscriber <R> )
            {
                CombineLatestConditionalSubscription parent = new CombineLatestConditionalSubscription((IConditionalSubscriber <R>)s, prefetch, delayError, combiner, n);

                s.OnSubscribe(parent);

                parent.Subscribe(a, n);
            }
            else
            {
                CombineLatestSubscription parent = new CombineLatestSubscription(s, prefetch, delayError, combiner, n);

                s.OnSubscribe(parent);

                parent.Subscribe(a, n);
            }
        }
        public void Subscribe(ISubscriber <T> s)
        {
            IEnumerator <T> enumerator;

            bool hasValue;

            try
            {
                enumerator = enumerable.GetEnumerator();

                hasValue = enumerator.MoveNext();
            }
            catch (Exception ex)
            {
                ExceptionHelper.ThrowIfFatal(ex);
                EmptySubscription <T> .Error(s, ex);

                return;
            }

            if (!hasValue)
            {
                EmptySubscription <T> .Complete(s);

                return;
            }

            if (s is IConditionalSubscriber <T> )
            {
                s.OnSubscribe(new EnumerableConditionalSubscription((IConditionalSubscriber <T>)s, enumerator));
            }
            else
            {
                s.OnSubscribe(new EnumerableSubscription(s, enumerator));
            }
        }
 public void Subscribe(ISubscriber <T> s)
 {
     EmptySubscription <T> .Complete(s);
 }
예제 #9
0
        /// <summary>
        /// Applies shortcuts if the source is the empty instance or an ICallable.
        /// </summary>
        /// <param name="source">The source IPublisher.</param>
        /// <param name="s">The ISubscriber</param>
        /// <param name="mapper">The function that takes a source value and maps it into an IPublisher.</param>
        /// <returns>True if the optimizations were applied.</returns>
        internal static bool CallableXMap(IPublisher <T> source, ISubscriber <R> s, Func <T, IPublisher <R> > mapper)
        {
            if (source == PublisherEmpty <T> .Instance)
            {
                EmptySubscription <R> .Complete(s);

                return(true);
            }
            if (source is ICallable <T> )
            {
                T t;

                try
                {
                    t = (source as ICallable <T>).Value;
                }
                catch (Exception ex)
                {
                    ExceptionHelper.ThrowIfFatal(ex);

                    EmptySubscription <R> .Error(s, ex);

                    return(true);
                }

                IPublisher <R> p;

                try
                {
                    p = mapper(t);
                }
                catch (Exception ex)
                {
                    ExceptionHelper.ThrowIfFatal(ex);

                    EmptySubscription <R> .Error(s, ex);

                    return(true);
                }

                if (p == null)
                {
                    EmptySubscription <R> .Error(s, new NullReferenceException("The mapper returned a null IPublisher"));

                    return(true);
                }

                if (p == PublisherEmpty <R> .Instance)
                {
                    EmptySubscription <R> .Complete(s);

                    return(true);
                }

                if (p is ICallable <R> )
                {
                    R r;

                    try
                    {
                        r = (p as ICallable <R>).Value;
                    }
                    catch (Exception ex)
                    {
                        ExceptionHelper.ThrowIfFatal(ex);

                        EmptySubscription <R> .Error(s, ex);

                        return(true);
                    }

                    s.OnSubscribe(new ScalarSubscription <R>(s, r));
                    return(true);
                }

                p.Subscribe(s);

                return(true);
            }

            return(false);
        }