1pub mod convergence;
2pub mod util;
3
4pub use freenet_scaffold_macro::*;
5use serde::de::DeserializeOwned;
6use serde::Serialize;
7use std::fmt::Debug;
8
9pub trait ComposableState {
10 type ParentState: Serialize + DeserializeOwned + Clone + Debug;
11 type Summary: Serialize + DeserializeOwned + Clone + Debug;
12 type Delta: Serialize + DeserializeOwned + Clone + Debug;
13 type Parameters: Serialize + DeserializeOwned + Clone + Debug;
14
15 fn verify(
16 &self,
17 parent_state: &Self::ParentState,
18 parameters: &Self::Parameters,
19 ) -> Result<(), String>;
20 fn summarize(
21 &self,
22 parent_state: &Self::ParentState,
23 parameters: &Self::Parameters,
24 ) -> Self::Summary;
25 fn delta(
26 &self,
27 parent_state: &Self::ParentState,
28 parameters: &Self::Parameters,
29 old_state_summary: &Self::Summary,
30 ) -> Option<Self::Delta>;
31
32 fn apply_delta(
37 &mut self,
38 parent_state: &Self::ParentState,
39 parameters: &Self::Parameters,
40 delta: &Option<Self::Delta>,
41 ) -> Result<(), String>;
42
43 fn merge(
45 &mut self,
46 parent_state: &Self::ParentState,
47 parameters: &Self::Parameters,
48 other_state: &Self,
49 ) -> Result<(), String> {
50 let my_summary = self.summarize(parent_state, parameters);
51 let delta_in = other_state.delta(parent_state, parameters, &my_summary);
52 self.apply_delta(parent_state, parameters, &delta_in)?;
53 Ok(())
54 }
55}
56
57#[cfg(test)]
58mod tests;