namespace Bts.DataStream; using BCG; using Spark.Core.Disposables; using System; using System.Reactive.Linq; public static class DataStreamExtensions { public static ViewStream AsViewStream(this IObservable source) => source as ViewStream ?? new ObservableViewStream(source); public static IObservable AsObservable(this ViewStream source) { return source as IObservable ?? Observable.Create(Subscribe); IDisposable Subscribe(IObserver observer) { source.onChange += OnChange; return Disposable.Create(() => source.onChange -= OnChange); void OnChange(object? newValue) => observer.OnNext(newValue as DataPacket ?? throw new ArgumentException( $"Expected DataPacket, got {newValue?.GetType()}", nameof(newValue))); } } }