<PackageReference Include="System.Reactive" Version="6.0.0-preview.1" />

TakeUntilPredicate<TSource>

sealed class TakeUntilPredicate<TSource> : Producer<TSource, TakeUntilPredicateObserver<TSource>>
Relays items to the downstream until the predicate returns true.
using System.Runtime.CompilerServices; namespace System.Reactive.Linq.ObservableImpl { [System.Runtime.CompilerServices.NullableContext(1)] [System.Runtime.CompilerServices.Nullable(new byte[] { 0, 1, 1, 1 })] internal sealed class TakeUntilPredicate<[System.Runtime.CompilerServices.Nullable(2)] TSource> : Producer<TSource, TakeUntilPredicate<TSource>.TakeUntilPredicateObserver> { [System.Runtime.CompilerServices.Nullable(new byte[] { 0, 1 })] internal sealed class TakeUntilPredicateObserver : IdentitySink<TSource> { private readonly Func<TSource, bool> _stopPredicate; public TakeUntilPredicateObserver(IObserver<TSource> downstream, Func<TSource, bool> predicate) : base(downstream) { _stopPredicate = predicate; } public override void OnCompleted() { ForwardOnCompleted(); } public override void OnError(Exception error) { ForwardOnError(error); } public override void OnNext(TSource value) { ForwardOnNext(value); bool flag = false; try { flag = _stopPredicate(value); } catch (Exception error) { ForwardOnError(error); return; } if (flag) ForwardOnCompleted(); } } private readonly IObservable<TSource> _source; private readonly Func<TSource, bool> _stopPredicate; public TakeUntilPredicate(IObservable<TSource> source, Func<TSource, bool> stopPredicate) { _source = source; _stopPredicate = stopPredicate; } [return: System.Runtime.CompilerServices.Nullable(new byte[] { 1, 0 })] protected override TakeUntilPredicateObserver CreateSink(IObserver<TSource> observer) { return new TakeUntilPredicateObserver(observer, _stopPredicate); } protected override void Run([System.Runtime.CompilerServices.Nullable(new byte[] { 1, 0 })] TakeUntilPredicateObserver sink) { sink.Run(_source); } } }