From da0e2bac19ee8f1623da6fc8b0ae82c683ff7c2e Mon Sep 17 00:00:00 2001 From: sigil-03 Date: Thu, 4 Dec 2025 16:08:46 -0700 Subject: [PATCH] WIP: add iterators for edges + nodes. NOTE: i don't like how the lifetimes worked out in the trait definitions --- src/graph.rs | 7 ++++++- src/test.rs | 12 +++++++++++- 2 files changed, 17 insertions(+), 2 deletions(-) diff --git a/src/graph.rs b/src/graph.rs index ee00ac2..4ac47e3 100644 --- a/src/graph.rs +++ b/src/graph.rs @@ -2,7 +2,12 @@ use crate::edge::Edge; use crate::node::Node; /// operations you might want to do on a graph or on nodes in a graph -pub trait Graph { +pub trait Graph<'g, N: Node + 'g, E: Edge + 'g> { + /// return the nodes of a graph + fn nodes(&'g self) -> impl Iterator; + + /// return the edges of a graph + fn edges(&'g self) -> impl Iterator; // Connect two nodes, and return the edge // TODO: figure out a way to modify self? is that even needed? // same for `disconnect()` diff --git a/src/test.rs b/src/test.rs index defe87d..f53a2d7 100644 --- a/src/test.rs +++ b/src/test.rs @@ -2,6 +2,7 @@ use std::collections::{HashMap, HashSet}; use crate::{edge::Edge, graph::Graph, node::Node}; +#[derive(Clone)] struct SimpleEdge { id: usize, n1: usize, @@ -12,6 +13,7 @@ impl Edge for SimpleEdge { type HANDLE = usize; } +#[derive(Clone)] struct SimpleNode { id: usize, edges: HashSet<::HANDLE>, @@ -48,7 +50,15 @@ impl SimpleGraph { } } -impl<'a> Graph for SimpleGraph { +impl<'g> Graph<'g, SimpleNode, SimpleEdge> for SimpleGraph { + fn nodes(&'g self) -> impl Iterator { + self.nodes.values().into_iter() + } + + fn edges(&'g self) -> impl Iterator { + self.edges.values().into_iter() + } + fn connect(&mut self, node_1: usize, node_2: usize) -> usize { let id = self.edges.len();