extern crate rustz;
use rustz::State;
#[derive(Debug,Clone,Copy)]
struct Account {
balance: i32,
}
fn deduct(d: i32) -> State<'static,Account, i32> {
State::new(move |a: Account| (Account { balance: a.balance - d }, 1))
}
fn contribute(d: i32) -> State<'static,Account, i32> {
State::new(move |a: Account| (Account { balance: a.balance + d }, 1))
}
fn main() {
let add_10_the_subtract_5 = contribute(10).flat_map(move |_: i32| deduct(5));
let account = Account { balance: 0 };
let (account2, fee) = add_10_the_subtract_5.run(account);
println!("New balance: {:?} , last transaction fee {:?}",
account2.balance,
fee);
}