namespace Jint.Tests.Runtime.ExtensionMethods; internal class Subscribe : IObserver { private readonly Action onNext; private readonly Action onError; private readonly Action onCompleted; readonly int isStopped = 0; public Subscribe(Action onNext, Action onError, Action onCompleted) { this.onNext = onNext; this.onError = onError; this.onCompleted = onCompleted; } public void OnNext(T value) { if (isStopped == 0) { onNext(value); } } public void OnError(Exception error) { onError(error); } public void OnCompleted() { onCompleted(); } } public static partial class ObservableExtensions { public static void Subscribe(this IObservable source, Action onNext) { var subs = new Subscribe(onNext, null, null); source.Subscribe(subs); } public static TResult Select(this IObservable source, TResult result) { return result; } public static IObservable Where(this IObservable source, Func predicate) { T t = default; predicate(t); return source; } public static IObservable Where(this IObservable source, Func predicate) { T t = default; bool result = predicate(t, 42); return source; } } public class BaseObservable : IObservable { private readonly List> observers = new List>(); public T Last { get; private set; } public IDisposable Subscribe(IObserver observer) { if (!observers.Contains(observer)) observers.Add(observer); return new Unsubscriber(observers, observer); } private class Unsubscriber : IDisposable { private readonly List> _observers; private readonly IObserver _observer; public Unsubscriber(List> observers, IObserver observer) { this._observers = observers; this._observer = observer; } public void Dispose() { if (_observer != null && _observers.Contains(_observer)) _observers.Remove(_observer); } } protected void BroadcastUpdate(T t) { foreach (var observer in observers) { observer.OnNext(t); } } public void Update(T t) { Last = t; BroadcastUpdate(t); } public void BroadcastCompleted() { foreach (var observer in observers.ToArray()) { observer.OnCompleted(); } observers.Clear(); } } public class ObservableFactory { public static BaseObservable GetBoolBaseObservable() { return new BaseObservable(); } } public class NameObservable : BaseObservable { public void UpdateName(string name) { Update(name); } public void CommitName() { BroadcastCompleted(); } }