namespace Salmon.Core.Depth; public abstract class Persistence { /// /// Must be thread safe /// Must return immediately /// /// May not be null /// public virtual void PushStateChange(string subject, string predicate, object? value, DateTime when) { Task.Run(async () => { try { var old = await GetLastValue(subject, predicate); if(old != value) await RegisterStateChange(subject, predicate, when, value); }catch (Exception ex) { ExceptionCatched(ex); } }).ConfigureAwait(false); } public abstract Task GetLastValue(string subject, string predicate); protected abstract Task RegisterStateChange(string subject, string predicate, DateTime when, object? value); protected virtual void ExceptionCatched(Exception e) { Console.WriteLine(e.ToString()); } }