rd-net/Lifetimes/Collections/Viewable/IAsyncSource.cs (31 lines of code) (raw):
using System;
using JetBrains.Annotations;
using JetBrains.Core;
using JetBrains.Lifetimes;
namespace JetBrains.Collections.Viewable;
public interface IAsyncSource<T>
{
void AdviseOn(Lifetime lifetime, IScheduler scheduler, Action<T> action);
}
class AsyncSignal<T> : IAsyncSource<T>
{
private readonly ISignal<T> mySignal = new Signal<T>();
public void AdviseOn(Lifetime lifetime, IScheduler scheduler, Action<T> action)
{
mySignal.Advise(lifetime, value =>
{
scheduler.Queue(() => action(value));
});
}
public void Fire(T value) => mySignal.Fire(value);
}
public interface IReadonlyAsyncProperty<T> : IAsyncSource<T>
{
IAsyncSource<T> Change { [NotNull] get; }
Maybe<T> Maybe { [NotNull] get; }
T Value { get; }
}
public interface IAsyncProperty<T> : IReadonlyAsyncProperty<T>
{
new T Value { get; set; }
}