1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
use crate::{
  fun::{Book, Term},
  maybe_grow,
};

/// Dereferences any generated definitions in the term.
/// Used after readback.
impl Term {
  pub fn expand_generated(&mut self, book: &Book) {
    maybe_grow(|| {
      if let Term::Ref { nam } = &*self {
        if nam.is_generated() {
          *self = book.defs.get(nam).unwrap().rule().body.clone();
        }
      }

      // Note: this assumes that there will never be a loop of generated functions.
      // This is true right now, but not necessarily in the future.
      for child in self.children_mut() {
        child.expand_generated(book);
      }
    })
  }
}