Compare commits

...
Sign in to create a new pull request.

1 commit

Author SHA1 Message Date
da0e2bac19 WIP: add iterators for edges + nodes.
NOTE:
i don't like how the lifetimes worked out in the trait definitions
2025-12-04 16:08:46 -07:00
2 changed files with 17 additions and 2 deletions

View file

@ -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<N: Node, E: Edge> {
pub trait Graph<'g, N: Node + 'g, E: Edge + 'g> {
/// return the nodes of a graph
fn nodes(&'g self) -> impl Iterator<Item = &'g N>;
/// return the edges of a graph
fn edges(&'g self) -> impl Iterator<Item = &'g E>;
// Connect two nodes, and return the edge
// TODO: figure out a way to modify self? is that even needed?
// same for `disconnect()`

View file

@ -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<<SimpleEdge as Edge>::HANDLE>,
@ -48,7 +50,15 @@ impl SimpleGraph {
}
}
impl<'a> Graph<SimpleNode, SimpleEdge> for SimpleGraph {
impl<'g> Graph<'g, SimpleNode, SimpleEdge> for SimpleGraph {
fn nodes(&'g self) -> impl Iterator<Item = &'g SimpleNode> {
self.nodes.values().into_iter()
}
fn edges(&'g self) -> impl Iterator<Item = &'g SimpleEdge> {
self.edges.values().into_iter()
}
fn connect(&mut self, node_1: usize, node_2: usize) -> usize {
let id = self.edges.len();