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); public abstract IAsyncEnumerable GetState(); protected abstract Task RegisterStateChange(string subject, string predicate, DateTime when, object? value); public abstract Task RegisterEvent(Event e); public abstract Task GetEvent(string id); public abstract IAsyncEnumerable GetEvents( string? subject = null, DateTime? from = null, DateTime? to = null, int? limit = null, int? offset = null, Event.ValenceType? valenceType = null, Dictionary? filters = null); protected virtual void ExceptionCatched(Exception e) { Console.WriteLine(e.ToString()); } }