array__ops 1.0.3

A selection of useful array operations
Documentation
use core::ops::Bound;

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

#[const_trait]
pub trait ArrayIsolate<T, const N: usize>: Array + AsSlice<Item = T>
{
    fn isolate(self, i: usize) -> Option<T>;
}

impl<T, const N: usize> ArrayIsolate<T, N> for [T; N]
{
    fn isolate(mut self, i: usize) -> Option<T>
    {
        if i >= N
        {
            return None
        }
        
        let value = unsafe {
            if core::mem::needs_drop::<T>()
            {
                core::ptr::drop_in_place(&mut self[0..i]);
                core::ptr::drop_in_place(&mut self[(Bound::Excluded(i), Bound::Excluded(N))]);
            }
            core::ptr::read(&self[i])
        };
        core::mem::forget(self);
        Some(value)
    }
}