using System; using System.Collections.Generic; namespace Jint.Tests.Runtime.ExtensionMethods { internal class Subscribe : IObserver { private readonly Action onNext; private readonly Action onError; private readonly Action onCompleted; 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 class NameObservable : IObservable { private List> observers = new List>(); public string 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 List> _observers; private 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); } } public void UpdateName(string name) { Last = name; foreach (var observer in observers) { observer.OnNext(name); } } public void CommitName() { foreach (var observer in observers.ToArray()) { observer.OnCompleted(); } observers.Clear(); } } }