How to use take_while with futures::Stream?

后端 未结 2 897
慢半拍i
慢半拍i 2021-01-26 16:32

I\'m trying to understand what syntax should I use for take_while() with futures::Stream; crate (0.1.25). Here\'s a piece of code (on playground):

u         


        
相关标签:
2条回答
  • 2021-01-26 17:19

    take_while expects the closure to return a future, or something that can be converted to a future. bool doesn't implement IntoFuture, so you have to wrap it in a future instead. future::ok returns a future that is immediately ready with the specified value.

    use futures::{future, stream, Stream}; // 0.1.25
    
    fn into_many(i: i32) -> impl Stream<Item = i32, Error = ()> {
        stream::iter_ok(0..i)
    }
    
    fn main() {
        println!("start:");
        let foo = into_many(10)
            .take_while(|&x| { future::ok(x < 10) })
            .map(|x| {
                println!("number={}", x);
                x
            })
            .wait();
    
        for _ in foo {}
    
        println!("finish:");
    }
    
    0 讨论(0)
  • 2021-01-26 17:21

    wait returns an iterator version of the stream, but that iterator remains lazy, which means you need to iterate it to actually execute your closure:

    use futures::{stream, Stream}; // 0.1.25
    
    fn into_many(i: i32) -> impl Stream<Item = i32, Error = ()> {
        stream::iter_ok(0..i)
    }
    
    fn main() {
        println!("start:");
        let foo = into_many(10)
            // .take_while(|x| { x < 10 })
            .map(|x| {
                println!("number={}", x);
                x
            })
            .wait();
    
        for _ in foo {} // ← this
    
        println!("finish:");
    }
    

    (link to playground)

    0 讨论(0)
提交回复
热议问题