1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
use crate::{generator::error_non_generator, handle_id_error, GenOp, NormalForm, Substitute, Term};
use scop::Defs;
use weresocool_error::Error;

impl Substitute<Term> for GenOp {
    fn substitute(
        &self,
        _normal_form: &mut NormalForm,
        defs: &mut Defs<Term>,
    ) -> Result<Term, Error> {
        match self {
            GenOp::Named { name, seed } => {
                let term = handle_id_error(name, defs)?;
                match term {
                    Term::Gen(gen) => {
                        gen.to_owned().set_seed(*seed);
                        Ok(Term::Gen(gen))
                    }
                    _ => Err(error_non_generator()),
                }
            }
            GenOp::Const { .. } => Ok(Term::Gen(self.to_owned())),
            GenOp::Taken { n, gen, seed } => {
                let term = gen.substitute(_normal_form, defs)?;
                match term {
                    Term::Gen(gen) => Ok(Term::Gen(GenOp::Taken {
                        n: *n,
                        gen: Box::new(gen),
                        seed: *seed,
                    })),

                    _ => Err(error_non_generator()),
                }
            }
        }
    }
}