array__ops 1.0.3

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

use super::{ArrayEnumerate, ArrayEnumerateVisit, ArrayMapAssign};

#[const_trait]
pub trait ArrayEnumerateMapAssign<T, const N: usize>: ArrayEnumerate<T, N> + ArrayMapAssign<T, N>
{
    fn enumerate_map_assign<Map>(&mut self, mapper: Map)
    where
        Map: FnMut(usize, T) -> T + ~const Destruct;
        
    async fn enumerate_map_assign_async<Map>(&mut self, mapper: Map)
    where
        Map: AsyncFn(usize, T) -> T + ~const Destruct;
        
    fn try_enumerate_map_assign<Map, E>(&mut self, mapper: Map) -> Result<(), E>
    where
        Map: FnMut(usize, T) -> Result<T, E> + ~const Destruct;
        
    async fn try_enumerate_map_assign_async<Map, E>(&mut self, mapper: Map) -> Result<(), E>
    where
        Map: AsyncFn(usize, T) -> Result<T, E> + ~const Destruct;
}

impl<T, const N: usize> ArrayEnumerateMapAssign<T, N> for [T; N]
{
    fn enumerate_map_assign<Map>(&mut self, mut mapper: Map)
    where
        Map: FnMut(usize, T) -> T
    {
        self.enumerate_visit_mut(|i, x| unsafe {
            let value = core::ptr::read(x);
            core::ptr::write(x, mapper(i, value))
        })
    }
    
    async fn enumerate_map_assign_async<Map>(&mut self, mapper: Map)
    where
        Map: AsyncFn(usize, T) -> T + Destruct
    {
        self.enumerate_visit_mut_async(async |i, x| unsafe {
            let value = core::ptr::read(x);
            core::ptr::write(x, mapper(i, value).await)
        }).await
    }
    
    fn try_enumerate_map_assign<Map, E>(&mut self, mut mapper: Map) -> Result<(), E>
    where
        Map: FnMut(usize, T) -> Result<T, E>
    {
        self.try_enumerate_visit_mut(|i, x| unsafe {
            let value = core::ptr::read(x);
            core::ptr::write(x, mapper(i, value)?);
            Ok(())
        })
    }
    
    async fn try_enumerate_map_assign_async<Map, E>(&mut self, mapper: Map) -> Result<(), E>
    where
        Map: AsyncFn(usize, T) -> Result<T, E>
    {
        self.try_enumerate_visit_mut_async(async |i, x| unsafe {
            let value = core::ptr::read(x);
            core::ptr::write(x, mapper(i, value).await?);
            Ok(())
        }).await
    }
}