trellis_core/
dependency.rs1use crate::{GraphError, GraphResult, NodeId};
2use std::collections::BTreeSet;
3
4#[derive(Clone, Debug, Default, Eq, PartialEq)]
6pub struct DependencyList {
7 nodes: Vec<NodeId>,
8}
9
10impl DependencyList {
11 pub fn new(nodes: impl IntoIterator<Item = NodeId>) -> GraphResult<Self> {
13 let mut seen = BTreeSet::new();
14 let mut ordered = Vec::new();
15
16 for node in nodes {
17 if !seen.insert(node) {
18 return Err(GraphError::DuplicateDependency(node));
19 }
20 ordered.push(node);
21 }
22
23 Ok(Self { nodes: ordered })
24 }
25
26 pub fn empty() -> Self {
28 Self { nodes: Vec::new() }
29 }
30
31 pub fn as_slice(&self) -> &[NodeId] {
33 &self.nodes
34 }
35
36 pub fn is_empty(&self) -> bool {
38 self.nodes.is_empty()
39 }
40}
41
42impl IntoIterator for DependencyList {
43 type Item = NodeId;
44 type IntoIter = std::vec::IntoIter<NodeId>;
45
46 fn into_iter(self) -> Self::IntoIter {
47 self.nodes.into_iter()
48 }
49}