use {
crate::{
construct::{
Algebraic, Construct, CtorFn, Decomposition, ElimFn, IntroductionRule, TypeFormer,
visit_self,
},
reflection::{TermsOfVariousTypes, Type, register, type_of},
},
core::{iter, num::NonZero},
std::collections::BTreeSet,
};
impl<T: Construct> Construct for Box<T> {
#[inline]
fn register_all_immediate_dependencies(visited: &mut BTreeSet<Type>) {
if !visited.insert(type_of::<Self>()) {
return;
}
let () = register::<T>(visited.clone());
}
#[inline]
fn type_former() -> TypeFormer<Self> {
TypeFormer::Algebraic(Algebraic {
introduction_rules: vec![IntroductionRule {
arbitrary_fields: |prng, mut sizes| {
let mut fields = TermsOfVariousTypes::new();
fields.push(sizes.arbitrary::<T>(prng));
fields
},
call: CtorFn::new(|terms| Some(Box::new(terms.must_pop()))),
immediate_dependencies: iter::once(type_of::<T>()).collect(),
}],
elimination_rule: ElimFn::new(|boxed| {
let mut fields = TermsOfVariousTypes::new();
let () = fields.push::<T>(*boxed);
Decomposition {
ctor_idx: const { NonZero::new(1).unwrap() },
fields,
}
}),
})
}
#[inline]
fn visit_deep<V: Construct>(&self) -> impl Iterator<Item = V> {
visit_self(self).chain(self.as_ref().visit_deep())
}
}