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); }