using System; using System.Collections.Generic; using System.Threading.Tasks; namespace DTLib.Reactive { public class ReactiveListener : ReactiveProvider { public ReactiveListener() { } public ReactiveListener(ReactiveStream stream) : base(stream) { } public EventHandlerAsync ElementAddedHandler; public void SetHandler(EventHandlerAsync handler) { lock (Stream) ElementAddedHandler = handler; } public async Task ElementAdded(T e) => await Task.Run(() => ElementAddedHandler?.Invoke(e)); public override void Join(ReactiveStream stream) { base.Join(stream); lock (Stream) stream.ElementAddedEvent += ElementAdded; } public override void Leave(ReactiveStream stream) { base.Leave(stream); lock (Stream) stream.ElementAddedEvent -= ElementAdded; } public T GetFirstElement() => Stream[0]; public T GetLastElement() => Stream[Stream.Length - 1]; public T FindOne(Func condition) => /*foreach (T el in Stream) if (condition(el)) return el;*/ default; public List FindAll(Func condition) { List elements = new(); /*foreach (T el in Stream) if (condition(el)) elements.Add(el);*/ return elements; } } }