using System; using System.Collections.Generic; namespace RosettaUI.Reactive { public abstract class Observable : IObservable { private List> _observers; public abstract T GetNotifyValue(); protected void NotifyValueChanged() { if (_observers != null) { var value = GetNotifyValue(); foreach (var observer in _observers) { observer.OnNext(value); } } } public IDisposable Subscribe(IObserver observer) { _observers ??= new List>(); if (!_observers.Contains(observer)) { _observers.Add(observer); } return new UnsubscribeObj(_observers, observer); } private class UnsubscribeObj : IDisposable { private readonly List> _observers; private readonly IObserver _observer; public UnsubscribeObj(List> observers, IObserver observer) { _observers = observers; _observer = observer; } public void Dispose() { if (_observer != null && _observers.Contains(_observer)) _observers.Remove(_observer); } } } public static class ObservableSubscribeAndCallOnceExtension { public static IDisposable SubscribeAndCallOnce(this Observable observable, Action onNext) { onNext?.Invoke(observable.GetNotifyValue()); return observable.Subscribe(onNext); } } }