stak_time/
primitive_set.rs

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