Function array_tools::try_init_with_iter [−][src]
pub fn try_init_with_iter<T, A, I, E>(iter: I) -> Result<Option<A>, E> where
A: FixedSizeArray<T>,
I: Iterator<Item = Result<T, E>>,
Attempts to initialize array of T
with iterator over Result<T, E>
values.
This function behaves much like init_with_iter
does.
- If iterator yields not enough items, this function returns
Ok(None)
. - If iterator yields enough items items to fill array, this function returns
Ok(Some(array))
. - If iterator yields excessive items, this function only takes required number of items and
returns
Ok(Some(array))
. - If iterator yields
Err
before array is fully initialized, this function stops immediately and returnsErr
obtained from iterator.
Panics
- Only if iterator's
next
method does.
Examples
use array_tools as art; #[derive(Debug, Clone, Copy, PartialEq, Eq)] struct MyErr; let mut iter = [Ok(3i32), Ok(2), Ok(1), Ok(0)].iter().copied(); let result: Result<Option<[i32; 5]>, MyErr> = art::try_init_with_iter(iter.by_ref()); assert_eq!(result, Ok(None)); assert_eq!(iter.next(), None); let mut iter = [Ok(4i32), Ok(3), Ok(2), Ok(1), Ok(0)].iter().copied(); let result: Result<Option<[i32; 5]>, MyErr> = art::try_init_with_iter(iter.by_ref()); assert_eq!(result, Ok(Some([4i32, 3, 2, 1, 0]))); assert_eq!(iter.next(), None); let mut iter = [Ok(5i32), Ok(4), Ok(3), Ok(2), Ok(1), Ok(0)].iter().copied(); let result: Result<Option<[i32; 5]>, MyErr> = art::try_init_with_iter(iter.by_ref()); assert_eq!(result, Ok(Some([5i32, 4, 3, 2, 1]))); assert_eq!(iter.next(), Some(Ok(0))); assert_eq!(iter.next(), None); let mut iter = [Ok(3i32), Ok(2), Ok(1), Err(MyErr)].iter().copied(); let result: Result<Option<[i32; 5]>, MyErr> = art::try_init_with_iter(iter.by_ref()); assert_eq!(result, Err(MyErr)); assert_eq!(iter.next(), None); let mut iter = [Ok(4i32), Ok(3), Ok(2), Ok(1), Err(MyErr)].iter().copied(); let result: Result<Option<[i32; 5]>, MyErr> = art::try_init_with_iter(iter.by_ref()); assert_eq!(result, Err(MyErr)); assert_eq!(iter.next(), None); let mut iter = [Ok(5i32), Ok(4), Ok(3), Ok(2), Ok(1), Err(MyErr)].iter().copied(); let result: Result<Option<[i32; 5]>, MyErr> = art::try_init_with_iter(iter.by_ref()); assert_eq!(result, Ok(Some([5i32, 4, 3, 2, 1]))); assert_eq!(iter.next(), Some(Err(MyErr))); assert_eq!(iter.next(), None);