From 99fee298c7e0dda32235c979ff2eea393b53fc78 Mon Sep 17 00:00:00 2001 From: asteri Date: Wed, 22 Apr 2026 11:59:40 +0200 Subject: [PATCH] add iterator in children nodes --- src/circuit/dag.rs | 29 +++++++++++++++++++++++++++++ 1 file changed, 29 insertions(+) diff --git a/src/circuit/dag.rs b/src/circuit/dag.rs index 7547db7..e21d793 100644 --- a/src/circuit/dag.rs +++ b/src/circuit/dag.rs @@ -15,6 +15,17 @@ pub enum Node { Prod(NodeId, NodeId), } +impl Node { + pub fn children(&self) -> impl Iterator { + match self { + Node::Leaf(_) => [None, None], + Node::Sum(l, r) | Node::Prod(l, r) => [Some(*l), Some(*r)], + } + .into_iter() + .flatten() + } +} + pub struct Circuit { nodes: SlotMap>, intern: HashMap, NodeId>, @@ -41,6 +52,18 @@ impl Circuit { self.nodes.get(id) } + pub fn add(&mut self, left: NodeId, right: NodeId) -> NodeId { + self.node(Node::Sum(left, right)) + } + + pub fn mul(&mut self, left: NodeId, right: NodeId) -> NodeId { + self.node(Node::Prod(left, right)) + } + + pub fn children(&self, id: NodeId) -> impl Iterator + '_ { + self.nodes.get(id).into_iter().flat_map(Node::children) + } + pub fn remove(&mut self, id: NodeId) { if let Some(node) = self.nodes.remove(id) { self.intern.remove(&node); @@ -55,6 +78,7 @@ pub struct CircuitNode { pub trait CircuitExt { fn leaf(&self, v: V) -> CircuitNode; + fn get_node(&self, id: NodeId) -> Option>; } impl CircuitExt for Rc>> { @@ -62,6 +86,11 @@ impl CircuitExt for Rc>> { let id = self.borrow_mut().node(Node::Leaf(v)); CircuitNode { id, circuit: self.clone() } } + + fn get_node(&self, id: NodeId) -> Option> { + self.borrow().get(id)?; + Some(CircuitNode { id, circuit: self.clone() }) + } } impl Add for CircuitNode {