use std::collections::{BTreeMap, BTreeSet};
use serde::{Deserialize, Serialize};
use crate::{Edge, Node, NodeName, PinRef};
#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
pub struct Graph {
name: String,
pub(crate) nodes: BTreeMap<NodeName, Node>,
pub(crate) edges: BTreeSet<Edge>,
}
impl Graph {
pub fn new(name: impl Into<String>) -> Self {
Self {
name: name.into(),
nodes: BTreeMap::new(),
edges: BTreeSet::new(),
}
}
pub fn name(&self) -> &str {
&self.name
}
pub fn insert_node(&mut self, node: Node) {
self.nodes.insert(node.name.clone(), node);
}
pub fn node(&self, name: &str) -> Option<&Node> {
if name.is_ascii() {
return self.nodes.get(name);
}
self.nodes.get(&NodeName::new(name))
}
pub fn nodes(&self) -> impl Iterator<Item = &Node> {
self.nodes.values()
}
pub fn insert_edge(&mut self, edge: Edge) {
self.edges.insert(edge);
}
pub fn edges(&self) -> impl Iterator<Item = &Edge> {
self.edges.iter()
}
pub fn edges_from(&self, pin: &PinRef) -> impl Iterator<Item = &Edge> {
self.edges.iter().filter(move |e| e.from() == pin)
}
pub fn edges_into(&self, pin: &PinRef) -> impl Iterator<Item = &Edge> {
self.edges.iter().filter(move |e| e.to() == pin)
}
}