#[cfg(feature = "supabase")]
pub mod supabase;
#[cfg(feature = "opfs")]
pub mod opfs;
#[cfg(target_arch = "wasm32")]
#[cfg(feature = "indexeddb")]
pub mod indexeddb;
pub mod data_model;
use crate::data_model::{Event, Timestamped};
pub trait PartialAppState: Sized {
type Event: Event;
type Partial: Sized;
fn process_event(partial: Self::Partial, event: &Timestamped<Self::Event>) -> Self::Partial;
fn finalize(partial: Self::Partial) -> Self;
}
pub trait AppState: PartialAppState {
fn apply_event(self, event: &Timestamped<Self::Event>) -> Self;
}
impl<T> AppState for T
where
T: PartialAppState,
T::Partial: From<T>,
{
fn apply_event(self, event: &Timestamped<Self::Event>) -> Self {
let partial = T::Partial::from(self);
let partial = T::process_event(partial, event);
T::finalize(partial)
}
}