use super::config::PathFinderConfig;
use crate::traits::{TriadRepr, TriadType};
use crate::triad::TriadBase;
use rspace_traits::RawSpace;
#[derive(Debug)]
pub struct PathFinder<'a, S, K, T = <S as RawSpace>::Elem>
where
K: TriadType,
S: TriadRepr<Elem = T>,
{
pub(crate) config: PathFinderConfig,
pub(crate) triad: &'a TriadBase<S, K, T>,
}
#[cfg(test)]
mod tests {
use crate::Triad;
#[test]
fn test_triad_path_finder() -> crate::Result<()> {
let tgt: isize = 1;
let c_major = Triad::major(0).dynamic();
let paths = c_major.path_finder().find_paths_to_target(tgt)?;
for chain in paths {
let p = chain.path().iter().copied();
assert! { c_major.walk(p).contains(&tgt) }
}
Ok(())
}
#[test]
#[cfg(feature = "rand")]
fn test_triad_path_finder_rand() -> crate::Result<()> {
let root: usize = rand::random_range(0..12);
let rtgt: usize = rand::random_range(1..12);
let target = rtgt as isize;
let triad = Triad::major(root as isize).dynamic();
let paths = triad.path_finder().find_paths_to_target(target)?;
for chain in paths {
let p = chain.path().clone();
assert! { triad.walk(p).contains(&target) }
}
Ok(())
}
}