rstm_core/actors/traits/
raw_driver.rs1use crate::rules::{Head, Tail};
7use rspace_traits::RawSpace;
8use rstm_state::{RawState, State};
9use rstm_traits::{Read, TryExecute};
10
11pub trait Driver<Q, A>
16where
17 for<'a> Self: Read<&'a mut [A], Output = &'a A>,
18{
19 private! {}
20 fn current_position(&self) -> usize;
22 fn current_state(&self) -> State<&Q>;
24}
25
26pub trait Actor<Q, A>: Driver<Q, A> + TryExecute<Tail<Q, A>>
28where
29 for<'a> Self: Read<&'a mut [A], Output = &'a A>,
30{
31 type Tape<_T>: RawSpace<Elem = _T>;
32 fn store(&self) -> &Self::Tape<A>;
34 fn store_mut(&mut self) -> &mut Self::Tape<A>;
36 fn replace_store(&mut self, store: Self::Tape<A>) -> Self::Tape<A> {
38 core::mem::replace(self.store_mut(), store)
39 }
40 fn set_store(&mut self, store: Self::Tape<A>) {
42 *self.store_mut() = store;
43 }
44 fn swap_store(&mut self, store: &mut Self::Tape<A>) {
46 core::mem::swap(self.store_mut(), store);
47 }
48 fn take_store(&mut self) -> Self::Tape<A>
50 where
51 Self::Tape<A>: Default,
52 {
53 core::mem::take(self.store_mut())
54 }
55}
56
57impl<Q, A> Driver<Q, A> for Head<Q, usize>
58where
59 Q: RawState,
60 for<'a> Self: Read<&'a mut [A], Output = &'a A>,
61{
62 seal! {}
63
64 fn current_position(&self) -> usize {
65 self.symbol
66 }
67
68 fn current_state(&self) -> State<&Q> {
69 self.state.view()
70 }
71}