use std::ops::Deref;
pub struct Layer<S> {
state: S,
}
impl<S> Layer<S> {
pub fn new(state: S) -> Self {
Self { state }
}
pub fn process<C>(
&mut self,
command: C,
events: &mut Vec<C::Event>,
) -> C::Result
where
C: Command<S>,
{
let result = command.decide(&self.state, events);
for event in events {
event.evolve(&mut self.state);
}
result
}
pub fn into_state(self) -> S {
self.state
}
}
impl<S> Deref for Layer<S> {
type Target = S;
fn deref(&self) -> &Self::Target {
&self.state
}
}
impl<S> Default for Layer<S>
where
S: Default,
{
fn default() -> Self {
Self::new(S::default())
}
}
pub trait Command<S> {
type Result;
type Event: Event<S>;
fn decide(self, state: &S, events: &mut Vec<Self::Event>) -> Self::Result;
}
pub trait Event<S> {
fn evolve(&self, state: &mut S);
}