use crate::dsl::{expand::MacroExpansionPass, ir::*, lower::ast_to_graph, spawn::SpawnKNodesPass};
pub trait GraphPass {
fn name(&self) -> &'static str;
fn run(&self, graph: IRGraph) -> IRGraph;
}
pub struct Pipeline {
passes: Vec<Box<dyn GraphPass>>,
}
impl Pipeline {
pub fn new() -> Self {
Self { passes: vec![] }
}
pub fn add_pass<P: GraphPass + 'static>(mut self, pass: P) -> Self {
self.passes.push(Box::new(pass));
self
}
pub fn run_from_ast(self, ast: Ast) -> IRGraph {
let initial = ast_to_graph(ast);
self.run(initial)
}
pub fn run(self, graph: IRGraph) -> IRGraph {
self.passes.into_iter().fold(graph, |g, pass| pass.run(g))
}
}
impl Default for Pipeline {
fn default() -> Self {
Self::new()
.add_pass(MacroExpansionPass)
.add_pass(SpawnKNodesPass)
}
}