stak_time/
primitive_set.rs

1mod error;
2mod primitive;
3
4pub use self::{error::PrimitiveError, primitive::Primitive};
5use crate::Clock;
6use stak_vm::{Error, Memory, Number, PrimitiveSet};
7
8/// A primitive set for time.
9pub struct TimePrimitiveSet<T: Clock> {
10    clock: T,
11}
12
13impl<T: Clock> TimePrimitiveSet<T> {
14    /// Creates a primitive set.
15    pub const fn new(clock: T) -> Self {
16        Self { clock }
17    }
18}
19
20impl<T: Clock> PrimitiveSet for TimePrimitiveSet<T> {
21    type Error = PrimitiveError;
22
23    fn operate(&mut self, memory: &mut Memory, primitive: usize) -> Result<(), Self::Error> {
24        match primitive {
25            Primitive::CURRENT_JIFFY => {
26                memory.push(
27                    Number::from_i64(
28                        self.clock
29                            .current_jiffy()
30                            .map_err(|_| PrimitiveError::CurrentJiffy)?
31                            as _,
32                    )
33                    .into(),
34                )?;
35            }
36            _ => return Err(Error::IllegalPrimitive.into()),
37        }
38
39        Ok(())
40    }
41}