rvs 0.5.0

A library for defining and evaluating random variables using a simple DSL
Documentation
use crate::transform::CrateRng;
use crate::model::{Expr, ExprData};

use std::fmt;

#[derive(Clone)]
pub struct Once {
    data: ExprData,
    expr: Box<dyn Expr>,
}

impl Once {
    pub fn new(expr: Box<dyn Expr>) -> Once {
        Once {
            data: Default::default(),
            expr,
        }
    }
}

impl Expr for Once {
    fn next(&mut self, rng: &mut CrateRng) -> u32 {
        if !self.data.done {
            self.data.prev = self.expr.next(rng);
        }
        self.data.done = true;

        self.data.prev
    }

    fn data(&self) -> &ExprData {
        &self.data
    }
}

impl fmt::Display for Once {
    fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
        write!(f, "Once({})", self.expr)
    }
}