use super::{ User, event::{Created, Event}, }; use crate::{ event::{Instant, Sequence}, login::Login, }; #[derive(Clone, Debug, Eq, PartialEq)] pub struct History { pub user: User, pub created: Instant, } // Lifecycle interface impl History { pub fn begin(login: &Login, created: Instant) -> Self { let Login { id, name } = login.clone(); Self { user: User { id: id.into(), name, }, created, } } } // State interface impl History { pub fn as_of(&self, sequence: S) -> Option where S: Into, { self.events() .filter(Sequence::up_to(sequence.into())) .collect() } } // Events interface impl History { fn created(&self) -> Event { Created { instant: self.created, user: self.user.clone(), } .into() } pub fn events(&self) -> impl Iterator + Clone + use<> { [self.created()].into_iter() } }