Skip to main content

trellis_core/
dependency.rs

1use crate::{GraphError, GraphResult, NodeId};
2use std::collections::BTreeSet;
3
4/// Deterministic list of explicit node dependencies.
5#[derive(Clone, Debug, Default, Eq, PartialEq)]
6pub struct DependencyList {
7    nodes: Vec<NodeId>,
8}
9
10impl DependencyList {
11    /// Creates a dependency list, rejecting duplicate node ids.
12    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    /// Creates an empty dependency list.
27    pub fn empty() -> Self {
28        Self { nodes: Vec::new() }
29    }
30
31    /// Returns dependencies in declared order.
32    pub fn as_slice(&self) -> &[NodeId] {
33        &self.nodes
34    }
35
36    /// Returns true when the list contains no dependencies.
37    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}