Iterate forward (non-parent) edges from a vertex. Returns typed [`ForwardEdge`] values. When `include_deleted` is true, deleted edges (`BlockDeleted`, `FolderDeleted`) are included; otherwise they are filtered out. This is the typed replacement for [`iter_adjacent`](Self::iter_adjacent) with forward-edge flag ranges. New code should prefer this over `iter_adjacent`.
(
&self,
node: GraphNode<NodeId>,
include_deleted: bool,
)
| 199 | /// with forward-edge flag ranges. New code should prefer this over |
| 200 | /// `iter_adjacent`. |
| 201 | fn iter_forward( |
| 202 | &self, |
| 203 | node: GraphNode<NodeId>, |
| 204 | include_deleted: bool, |
| 205 | ) -> Result<Vec<ForwardEdge>, PristineError> { |
| 206 | // Flag-range bounds: |
| 207 | // alive only → [0x00, 0x14] (empty ..= PSEUDO|FOLDER) |
| 208 | // with deleted → [0x00, 0x90] (empty ..= DELETED|FOLDER) |
| 209 | // |
| 210 | // The wider range may include PARENT edges (0x20–0x34) when |
| 211 | // include_deleted is true; the loop filters them out. |
| 212 | let min_flag = EdgeFlags::empty(); |
| 213 | let max_flag = if include_deleted { |
| 214 | EdgeFlags::DELETED | EdgeFlags::FOLDER |
| 215 | } else { |
| 216 | EdgeFlags::PSEUDO | EdgeFlags::FOLDER |
| 217 | }; |
| 218 | |
| 219 | let adj = self.iter_adjacent(node, min_flag, max_flag)?; |
| 220 | let mut result = Vec::new(); |
| 221 | for edge_result in adj { |
| 222 | let edge = edge_result?; |
| 223 | // Skip any parent edges that snuck into the range |
| 224 | if edge.flag().contains(EdgeFlags::PARENT) { |
| 225 | continue; |
| 226 | } |
| 227 | if let Some(forward) = ForwardEdge::from_serialized(&edge) { |
| 228 | result.push(forward); |
| 229 | } |
| 230 | } |
| 231 | Ok(result) |
| 232 | } |
| 233 | |
| 234 | /// Iterate parent (reverse) edges of a vertex. |
| 235 | /// |