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 returns Err 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);