use core::ops::Mul;
pub use hybrid_array;
use hybrid_array::Array;
use hybrid_array::ArraySize;
use hybrid_array::AssocArraySize;
use hybrid_array::typenum::Prod;
#[cfg(doc)]
use crate::array_from_core;
#[cfg(doc)]
use crate::array_to_core;
pub fn flatten<T, I, O>(input: Array<Array<T, I>, O>) -> Array<T, Prod<I, O>>
where
I: Mul<O>,
I::Output: ArraySize,
I: ArraySize,
O: ArraySize,
T: Default + Copy,
{
let mut output = Array::default();
let mut offset = 0;
for array in input.iter() {
let len = array.len();
output[offset..offset + len].copy_from_slice(array);
offset += len;
}
output
}
pub fn chunks<T, I, O>(input: Array<T, Prod<I, O>>) -> Array<Array<T, I>, O>
where
I: Mul<O>,
I::Output: ArraySize,
I: ArraySize,
O: ArraySize,
T: Default + Copy,
{
let mut output: Array<Array<T, I>, O> = Array::default();
let mut offset = 0;
for array in output.iter_mut() {
let len = array.len();
array.copy_from_slice(&input[offset..offset + len]);
offset += len;
}
output
}
pub type ArrayOfArrays<T, const I: usize, const O: usize> =
Array<Array<T, <[T; I] as AssocArraySize>::Size>, <[[T; I]; O] as AssocArraySize>::Size>;
pub fn chunks_to_core<T, const I: usize, const O: usize>(
input: ArrayOfArrays<T, I, O>,
) -> [[T; I]; O]
where
[T; I]: AssocArraySize,
[[T; I]; O]: AssocArraySize,
<[T; I] as AssocArraySize>::Size: ArraySize<ArrayType<T> = [T; I]>,
<[[T; I]; O] as AssocArraySize>::Size: ArraySize<ArrayType<[T; I]> = [[T; I]; O]>,
{
let a = input.map(|array| array.0);
a.0
}
pub fn chunks_from_core<T, const I: usize, const O: usize>(
input: [[T; I]; O],
) -> ArrayOfArrays<T, I, O>
where
[T; I]: AssocArraySize,
[[T; I]; O]: AssocArraySize,
<[T; I] as AssocArraySize>::Size: ArraySize<ArrayType<T> = [T; I]>,
<[[T; I]; O] as AssocArraySize>::Size: ArraySize<ArrayType<[T; I]> = [[T; I]; O]>,
{
Array(input).map(|array| Array(array))
}