use std::pin::Pin; use crate::prelude::*; use crate::stream::{Stream, Sum}; impl Sum> for Option where T: Sum, { #[doc = r#" Takes each element in the `Iterator`: if it is a `None`, no further elements are taken, and the `None` is returned. Should no `None` occur, the sum of all elements is returned. # Examples This sums up the position of the character 'a' in a vector of strings, if a word did not have the character 'a' the operation returns `None`: ``` # fn main() { async_std::task::block_on(async { # use async_std::prelude::*; use async_std::stream; let words = stream::from_iter(vec!["have", "a", "great", "day"]); let total: Option = words.map(|w| w.find('a')).sum().await; assert_eq!(total, Some(5)); # # }) } ``` "#] fn sum<'a, S>(stream: S) -> Pin> + 'a>> where S: Stream> + 'a { Box::pin(async move { // Using `scan` here because it is able to stop the stream early // if a failure occurs let mut found_none = false; let out = >::sum(stream .scan((), |_, elem| { match elem { Some(elem) => Some(elem), None => { found_none = true; // Stop processing the stream on error None } } })).await; if found_none { None } else { Some(out) } }) } }