pub fn from_iter<T: 'static, I: 'static>(iter: I) -> Source<T> where
    T: Send + Sync,
    I: IntoIterator<Item = T> + Send + Sync + Clone,
    <I as IntoIterator>::IntoIter: Send + Sync
Expand description

Converts an iterable or Iterator to a callbag pullable source.

It only sends data when requested.

See https://github.com/staltz/callbag-from-iter/blob/a5942d3a23da500b771d2078f296df2e41235b3a/index.js#L1-L34

Examples

Convert an iterable:

use crossbeam_queue::SegQueue;
use std::sync::Arc;

use callbag::{for_each, from_iter};

let actual = Arc::new(SegQueue::new());

let source = from_iter([10, 20, 30, 40]);

for_each({
    let actual = Arc::clone(&actual);
    move |x| {
        println!("{}", x);
        actual.push(x);
    }
})(source);

assert_eq!(
    &{
        let mut v = vec![];
        for _i in 0..actual.len() {
            v.push(actual.pop().unwrap());
        }
        v
    }[..],
    [10, 20, 30, 40]
);

Convert an Iterator:

use crossbeam_queue::SegQueue;
use std::sync::Arc;

use callbag::{for_each, from_iter};

let actual = Arc::new(SegQueue::new());

let source = from_iter([10, 20, 30, 40].into_iter().enumerate());

for_each({
    let actual = Arc::clone(&actual);
    move |x| {
        println!("{:?}", x);
        actual.push(x);
    }
})(source);

assert_eq!(
    &{
        let mut v = vec![];
        for _i in 0..actual.len() {
            v.push(actual.pop().unwrap());
        }
        v
    }[..],
    [(0, 10), (1, 20), (2, 30), (3, 40)]
);