use leo_ast::{
AstReconstructor,
Block,
Expression,
Identifier,
IterationStatement,
NodeBuilder,
ProgramReconstructor,
Statement,
};
pub struct Replacer<'a, F>
where
F: Fn(&Identifier) -> Expression,
{
node_builder: &'a NodeBuilder,
replace: F,
}
impl<'a, F> Replacer<'a, F>
where
F: Fn(&Identifier) -> Expression,
{
pub fn new(replace: F, node_builder: &'a NodeBuilder) -> Self {
Self { replace, node_builder }
}
}
impl<F> AstReconstructor for Replacer<'_, F>
where
F: Fn(&Identifier) -> Expression,
{
type AdditionalOutput = ();
fn reconstruct_identifier(&mut self, input: Identifier) -> (Expression, Self::AdditionalOutput) {
((self.replace)(&input), Default::default())
}
fn reconstruct_block(&mut self, input: Block) -> (Block, Self::AdditionalOutput) {
(
Block {
statements: input.statements.into_iter().map(|s| self.reconstruct_statement(s).0).collect(),
span: input.span,
id: self.node_builder.next_id(),
},
Default::default(),
)
}
fn reconstruct_iteration(&mut self, input: IterationStatement) -> (Statement, Self::AdditionalOutput) {
(
IterationStatement {
type_: input.type_.map(|ty| self.reconstruct_type(ty).0),
start: self.reconstruct_expression(input.start).0,
stop: self.reconstruct_expression(input.stop).0,
block: self.reconstruct_block(input.block).0,
id: self.node_builder.next_id(),
..input
}
.into(),
Default::default(),
)
}
}
impl<F> ProgramReconstructor for Replacer<'_, F> where F: Fn(&Identifier) -> Expression {}