Esempio n. 1
0
        public IDisposable Subscribe(IObserver <bool> observer)
        {
            var disposer = new SubscribeDisposer(this, observer);

            IObserver <bool>[]? previousObservers = null;
            IObserver <bool>[]? nextObservers     = null;

            do
            {
                previousObservers = observers;

                var nextLength = previousObservers is null ? 1 : previousObservers.Length + 1;
                nextObservers = new IObserver <bool> [nextLength];

                previousObservers?.CopyTo(nextObservers, 0);
                nextObservers[nextLength - 1] = observer;
            } while (!ReferenceEquals(Interlocked.CompareExchange(ref observers, nextObservers, previousObservers), previousObservers));

            if (pushValueAtSubscribe)
            {
                observer.OnNext(IsEntered);
            }

            return(disposer);
        }