rene 0.2.0

Computational geometry.
Documentation
use std::collections::hash_map::RandomState;
use std::collections::hash_set::HashSet;
use std::hash::Hash;
use std::iter::FromIterator;

pub(super) fn are_non_empty_unique_sequences_rotationally_equivalent<
    T: PartialEq,
>(
    left: &[T],
    right: &[T],
) -> bool {
    debug_assert!(!left.is_empty() && !right.is_empty());
    left.len() == right.len() && {
        let left_first_element = &left[0];
        right
            .iter()
            .position(|value| value == left_first_element)
            .is_some_and(|index| {
                (left[1..left.len() - index] == right[index + 1..]
                    && left[left.len() - index..] == right[..index])
                    || (left[1..=index].iter().eq(right[..index].iter().rev())
                        && left[index + 1..]
                            .iter()
                            .eq(right[index + 1..].iter().rev()))
            })
    }
}

pub(super) fn are_unique_hashable_sequences_permutationally_equivalent<
    T: Eq + Hash,
>(
    left: &[T],
    right: &[T],
) -> bool {
    left.len() == right.len() && {
        let left_set = HashSet::<_, RandomState>::from_iter(left);
        right.iter().all(|value| left_set.contains(value))
    }
}