diff --git a/src/helper.rs b/src/helper.rs index 2c91f75..44cc143 100644 --- a/src/helper.rs +++ b/src/helper.rs @@ -1,4 +1,30 @@ +/** Given an array of arguments, return them sorted. +Best utilised with array destructuring. */ pub fn ordered(mut xs: [T; N]) -> [T; N] { xs.sort(); xs } + +/** An iterator adaptor (derived from ExactSizedIterator) which has a guaranteed +compile time size, allowing for collection of an iterator into a stack allocated +array. */ +pub trait ExactSizedArr: ExactSizeIterator + Sized +where + I: Default, +{ + fn into_array(mut self) -> Result<[Self::Item; N], Self> { + if self.len() < N { + Err(self) + } else { + Ok(std::array::from_fn(|_| self.next().unwrap())) + } + } +} + +/** Default implementation of ExactSizedArr for any ExactSizeIterator. */ +impl ExactSizedArr for I +where + T: Default + Copy + Clone, + I: ExactSizeIterator, +{ +}