use ahash::AHashSet;
use crate::value::EntityId;
pub fn find_cycle(
start: EntityId,
max_depth: usize,
mut successors: impl FnMut(EntityId) -> Vec<EntityId>,
) -> Option<Vec<EntityId>> {
let mut stack: Vec<(EntityId, Vec<EntityId>)> = vec![(start, Vec::new())];
while let Some((node, mut path)) = stack.pop() {
if let Some(position) = path.iter().position(|seen| *seen == node) {
let mut cycle = path[position..].to_vec();
cycle.push(node);
return Some(cycle);
}
if path.len() >= max_depth {
continue;
}
path.push(node);
let mut unique = AHashSet::new();
for successor in successors(node) {
if unique.insert(successor) {
stack.push((successor, path.clone()));
}
}
}
None
}