use crate::{
mast::{
BasicBlockNodeBuilder, ExternalNodeBuilder, MastForest, MastForestContributor,
MastForestError, MastNode, MastNodeBuilder, MastNodeId, node::MastNodeExt,
},
utils::LookupByIdx,
};
pub fn build_node_with_remapped_ids<NMap>(
node_id: MastNodeId,
node: MastNode,
source_forest: &MastForest,
node_remapping: &NMap,
) -> Result<MastNodeBuilder, MastForestError>
where
NMap: LookupByIdx<MastNodeId, MastNodeId>,
{
let _ = node_id;
let builder = match node {
MastNode::Join(join_node) => {
let builder = join_node.to_builder(source_forest).remap_children(node_remapping);
MastNodeBuilder::Join(builder)
},
MastNode::Split(split_node) => {
let builder = split_node.to_builder(source_forest).remap_children(node_remapping);
MastNodeBuilder::Split(builder)
},
MastNode::Loop(loop_node) => {
let builder = loop_node.to_builder(source_forest).remap_children(node_remapping);
MastNodeBuilder::Loop(builder)
},
MastNode::Call(call_node) => {
let builder = call_node.to_builder(source_forest).remap_children(node_remapping);
MastNodeBuilder::Call(builder)
},
MastNode::Block(basic_block_node) => {
let builder = BasicBlockNodeBuilder::from_op_batches(
basic_block_node.op_batches().to_vec(),
basic_block_node.digest(),
);
MastNodeBuilder::BasicBlock(builder)
},
MastNode::Dyn(dyn_node) => {
let builder = dyn_node.to_builder(source_forest);
MastNodeBuilder::Dyn(builder)
},
MastNode::External(external_node) => {
let builder = ExternalNodeBuilder::new(external_node.digest());
MastNodeBuilder::External(builder)
},
};
Ok(builder)
}