use super::request::EdgeTemplate;
use crate::graph::NodeId;
#[derive(Clone, Copy, Hash, PartialEq, Eq)]
pub struct SlotId(NodeId, NodeId);
impl SlotId {
pub fn new(source: NodeId, target: NodeId) -> Self {
if source < target {
Self(source, target)
} else {
Self(target, source)
}
}
}
#[derive(Clone, Copy, PartialEq, Eq)]
pub enum SlotKind {
Regular { source: NodeId, target: NodeId },
SelfEdge { node: NodeId },
}
pub struct Slot<'a> {
pub kind: SlotKind,
pub edges: Vec<&'a EdgeTemplate>,
}
pub fn slotted_edges<'a>(
edges: impl Iterator<Item = &'a EdgeTemplate>,
) -> ahash::HashMap<SlotId, Slot<'a>> {
let mut slots: ahash::HashMap<SlotId, Slot<'a>> = ahash::HashMap::default();
for e in edges {
let id = SlotId::new(e.source, e.target);
let slot = slots.entry(id).or_insert_with_key(|id| Slot {
kind: if e.source == e.target {
SlotKind::SelfEdge { node: e.source }
} else {
SlotKind::Regular {
source: id.0,
target: id.1,
}
},
edges: Vec::new(),
});
slot.edges.push(e);
}
slots
}