orx-parallel 4.0.0

Performant parallel computations with an expressive iterator API.
Documentation
use crate::infallible::fun::FlatMap;
use core::marker::PhantomData;

/// Flat-map adapter backed by a closure.
pub struct FnFlatMap<I, O: IntoIterator, F: Fn(I) -> O + Copy + Send>(F, PhantomData<(I, O)>);

impl<I, O: IntoIterator, F: Fn(I) -> O + Copy + Send> Clone for FnFlatMap<I, O, F> {
    fn clone(&self) -> Self {
        *self
    }
}

impl<I, O: IntoIterator, F: Fn(I) -> O + Copy + Send> Copy for FnFlatMap<I, O, F> {}

unsafe impl<I, O: IntoIterator, F: Fn(I) -> O + Copy + Send> Send for FnFlatMap<I, O, F> {}

impl<I, O: IntoIterator, F: Fn(I) -> O + Copy + Send> FnFlatMap<I, O, F> {
    /// Creates a flat-map adapter.
    pub fn new(f: F) -> Self {
        Self(f, PhantomData)
    }
}

impl<I, O: IntoIterator, F: Fn(I) -> O + Copy + Send> FlatMap for FnFlatMap<I, O, F> {
    type I = I;

    type O = O;

    #[inline(always)]
    fn flat_map(&self, i: Self::I) -> Self::O {
        (self.0)(i)
    }
}