array__ops 1.0.3

A selection of useful array operations
Documentation
use core::{marker::Destruct, pin::Pin};

use array_trait::Array;
use slice_ops::AsSlice;

use crate::private::guard::PartialEmptyGuard;

#[const_trait]
pub trait ArrayFold<T, const N: usize>: Array + AsSlice<Item = T>
{
    fn fold<F, O>(self, default: O, fold: F) -> O
    where
        F: FnMut(O, T) -> O + ~const Destruct;
    fn fold_ref<'a, F, O>(&'a self, default: O, fold: F) -> O
    where
        F: FnMut(O, &'a T) -> O + ~const Destruct,
        T: 'a;
    fn fold_mut<'a, F, O>(&'a mut self, default: O, fold: F) -> O
    where
        F: FnMut(O, &'a mut T) -> O + ~const Destruct,
        T: 'a;
    fn fold_pin_ref<'a, F, O>(self: Pin<&'a Self>, default: O, fold: F) -> O
    where
        F: FnMut(O, Pin<&'a T>) -> O + ~const Destruct,
        T: 'a;
    fn fold_pin_mut<'a, F, O>(self: Pin<&'a mut Self>, default: O, fold: F) -> O
    where
        F: FnMut(O, Pin<&'a mut T>) -> O + ~const Destruct,
        T: 'a;
}

impl<T, const N: usize> ArrayFold<T, N> for [T; N]
{
    fn fold<F, O>(self, default: O, fold: F) -> O
    where
        F: FnMut(O, T) -> O
    {
        PartialEmptyGuard::new_left(self).fold(default, fold)
    }
    fn fold_ref<'a, F, O>(&'a self, default: O, fold: F) -> O
    where
        F: FnMut(O, &'a T) -> O,
        T: 'a
    {
        PartialEmptyGuard::new_left(self).fold(default, fold)
    }
    fn fold_mut<'a, F, O>(&'a mut self, default: O, fold: F) -> O
    where
        F: FnMut(O, &'a mut T) -> O,
        T: 'a
    {
        PartialEmptyGuard::new_left(self).fold(default, fold)
    }
    fn fold_pin_ref<'a, F, O>(self: Pin<&'a Self>, default: O, fold: F) -> O
    where
        F: FnMut(O, Pin<&'a T>) -> O,
        T: 'a
    {
        PartialEmptyGuard::new_left(self).fold(default, fold)
    }
    fn fold_pin_mut<'a, F, O>(self: Pin<&'a mut Self>, default: O, fold: F) -> O
    where
        F: FnMut(O, Pin<&'a mut T>) -> O,
        T: 'a
    {
        PartialEmptyGuard::new_left(self).fold(default, fold)
    }
}