codeinput 0.0.3

A powerful library for parsing, analyzing, and managing CODEOWNERS files. Provides advanced querying capabilities, ownership analysis, and tag-based file organization.
Documentation
#![allow(dead_code)]

use rayon::iter::{IntoParallelRefIterator, ParallelIterator};

pub(crate) trait SmartIter<T: Send + Sync> {
    fn smart_iter(&self, n: usize) -> SmartIterator<T>;
}

impl<T: Send + Sync> SmartIter<T> for [T] {
    fn smart_iter(&self, n: usize) -> SmartIterator<T> {
        if self.len() <= n {
            SmartIterator::Sequential(self.iter())
        } else {
            SmartIterator::Parallel(self.par_iter())
        }
    }
}

pub(crate) enum SmartIterator<'a, T: Send + Sync> {
    Sequential(std::slice::Iter<'a, T>),
    Parallel(rayon::slice::Iter<'a, T>),
}

pub(crate) enum SmartFilterMap<'a, T: Send + Sync, F> {
    Parallel(rayon::iter::FilterMap<rayon::slice::Iter<'a, T>, F>),
    Sequential(std::iter::FilterMap<std::slice::Iter<'a, T>, F>),
}

impl<'a, T: Send + Sync> SmartIterator<'a, T> {
    pub(crate) fn filter_map<B: Send + Sync, F>(self, f: F) -> SmartFilterMap<'a, T, F>
    where
        F: Fn(&'a T) -> Option<B> + Send + Sync,
    {
        match self {
            SmartIterator::Parallel(iter) => SmartFilterMap::Parallel(iter.filter_map(f)),
            SmartIterator::Sequential(iter) => SmartFilterMap::Sequential(iter.filter_map(f)),
        }
    }
}

impl<'a, T: Send + Sync, B: Send + Sync, F> SmartFilterMap<'a, T, F>
where
    F: Fn(&'a T) -> Option<B> + Send + Sync,
{
    pub(crate) fn collect(self) -> Vec<B> {
        match self {
            SmartFilterMap::Parallel(iter) => iter.collect(),
            SmartFilterMap::Sequential(iter) => iter.collect(),
        }
    }
}