use std::collections::{HashMap, HashSet};
#[must_use]
pub fn resolve_chain<K>(map: &HashMap<K, K>, start: K) -> K
where
K: Copy + std::hash::Hash + Eq,
{
let mut current = start;
let mut visited = HashSet::new();
while let Some(&next) = map.get(¤t) {
if !visited.insert(current) {
break;
}
current = next;
}
current
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn test_resolve_chain_follows_mappings() {
let mut map = HashMap::new();
map.insert(1, 2);
map.insert(2, 3);
map.insert(3, 4);
assert_eq!(resolve_chain(&map, 1), 4);
assert_eq!(resolve_chain(&map, 2), 4);
assert_eq!(resolve_chain(&map, 3), 4);
assert_eq!(resolve_chain(&map, 4), 4);
}
#[test]
fn test_resolve_chain_handles_cycles() {
let mut map = HashMap::new();
map.insert(1, 2);
map.insert(2, 1);
let result = resolve_chain(&map, 1);
assert!(result == 1 || result == 2);
}
#[test]
fn test_resolve_chain_single_step() {
let mut map = HashMap::new();
map.insert(5, 10);
assert_eq!(resolve_chain(&map, 5), 10);
}
#[test]
fn test_resolve_chain_empty_map() {
let map: HashMap<usize, usize> = HashMap::new();
assert_eq!(resolve_chain(&map, 42), 42);
}
#[test]
fn test_resolve_chain_self_loop() {
let mut map = HashMap::new();
map.insert(1, 1);
assert_eq!(resolve_chain(&map, 1), 1);
}
}