use inc_complete::{
Db, Input, Storage,
accumulate::{Accumulated, Accumulator},
define_input, define_intermediate, intermediate,
storage::{HashMapStorage, SingletonStorage},
};
#[derive(Default, Storage)]
struct Calculator {
input_a: SingletonStorage<InputA>,
input_b: SingletonStorage<InputB>,
#[inc_complete(computation = Sum)]
sum: SingletonStorage<Sum>,
#[inc_complete(skip)]
#[allow(unused)]
dummy: u32,
log_storage: HashMapStorage<Accumulated<String>>,
#[inc_complete(accumulate)]
logs: Accumulator<String>,
}
#[derive(Debug, Clone, Input)]
#[inc_complete(id = 0, output = i32, storage = Calculator)]
struct InputA;
#[derive(Debug, Clone, Input)]
#[inc_complete(id = 1, output = i32, storage = Calculator)]
struct InputB;
#[derive(Debug, Clone)]
struct Sum;
#[intermediate(id = 2)]
fn compute_sum(_sum: &Sum, db: &inc_complete::DbHandle<Calculator>) -> i32 {
db.get(InputA) + db.get(InputB)
}
#[test]
fn test_simple_calculator() {
let mut db = Db::<Calculator>::new();
InputA.set(&mut db, 5);
InputB.set(&mut db, 3);
let result = db.get(Sum);
assert_eq!(result, 8);
InputA.set(&mut db, 10);
let result = db.get(Sum);
assert_eq!(result, 13);
InputB.set(&mut db, 7);
let result = db.get(Sum);
assert_eq!(result, 17);
}