use crate::{GraphError, GraphResult, NodeId};
use std::collections::BTreeSet;
#[derive(Clone, Debug, Default, Eq, PartialEq)]
pub struct DependencyList {
nodes: Vec<NodeId>,
}
impl DependencyList {
pub fn new(nodes: impl IntoIterator<Item = NodeId>) -> GraphResult<Self> {
let mut seen = BTreeSet::new();
let mut ordered = Vec::new();
for node in nodes {
if !seen.insert(node) {
return Err(GraphError::DuplicateDependency(node));
}
ordered.push(node);
}
Ok(Self { nodes: ordered })
}
pub fn empty() -> Self {
Self { nodes: Vec::new() }
}
pub fn as_slice(&self) -> &[NodeId] {
&self.nodes
}
pub fn is_empty(&self) -> bool {
self.nodes.is_empty()
}
}
impl IntoIterator for DependencyList {
type Item = NodeId;
type IntoIter = std::vec::IntoIter<NodeId>;
fn into_iter(self) -> Self::IntoIter {
self.nodes.into_iter()
}
}