unfold

Function unfold 

Source
pub fn unfold<T, F, Fut, Item, E>(init: T, function: F) -> Unfold<T, F, Fut>
where F: FnMut(T, Item) -> Fut, Fut: Future<Output = Result<T, E>>,
Expand description

Create a sink from a function which processes one item at a time.

ยงExamples

use core::pin::pin;
use async_sink::SinkExt;
use tokio::sync::Mutex;
use std::sync::Arc;

#[tokio::main]
async fn main() {
let output: Arc<Mutex<Vec<usize>>> = Arc::new(tokio::sync::Mutex::new(Vec::new()));

let unfold = async_sink::unfold(0, |mut sum, i: usize| {
   let cb_output = output.clone();
   async move {
        sum += i;
        cb_output.clone().lock().await.push(sum);
        Ok::<_, core::convert::Infallible>(sum)
   }
});
let mut unfold = pin!(unfold);
let input: [usize; 3] = [5, 15, 35];
assert!(unfold.send_all(&mut tokio_stream::iter(input.iter().copied().map(|i| Ok(i)))).await.is_ok());
assert_eq!(output.lock().await.as_slice(),input.iter().scan(0, |state, &x|
  { *state += x; Some(*state) }).collect::<Vec<usize>>().as_slice()
);
}