use std::time::Duration;
use tokio::time::sleep;
use zubr_state_machine::*;
#[tokio::main]
async fn main() {
let mut sm = StateMachine::<u64, u64, u64>::new(
0u64, 10, |input, state| input + state, |state| state * state, );
let mut output_handle = sm.spawn_output_handle();
let input_handle_async = sm.spawn_input_handle();
let input_handle_sync = sm.spawn_input_handle();
let join = tokio::spawn(async move { sm.run().await;
});
let async_input_join = tokio::spawn(async move { sleep(Duration::from_millis(500)).await;
input_handle_async.send_async(1).await.unwrap();
});
let asynchronous_result = output_handle.await_state_change().await.unwrap(); let _ = input_handle_sync.send(2);
sleep(Duration::from_millis(50)).await;
let synchronous_result = output_handle.try_read().unwrap();
println!("{}", asynchronous_result); println!("{}", synchronous_result);
output_handle.close();
let _ = join.await;
let _ = async_input_join.await;
}