Stream 트레잇

Stream 트레잇은 Future와 비슷하지만 작업을 끝내기 전 여러 값을 산출할 수 있다는 점에서 다릅니다. Stream은 표준 라이브러리의 Iterator 트레잇과 비슷하다고 보면 됩니다.

trait Stream {
    /// 스트림이 양보하는 값의 타입
    type Item;

    /// 스트림에 있는 다음 아이템을 해결하려 한다.
    /// 아직 준비가 안 됐으면 `Poll::Pending`, 준비가 되었으면 `Poll::Ready(Some(x))`
    /// , 끝났으면 `Poll::Ready(None)`을 반환한다.
    fn poll_next(self: Pin<&mut Self>, cx: &mut Context<'_>)
        -> Poll<Option<Self::Item>>;
}

Stream의 한 가지 예시로 futures 크레이트에 있고 채널 타입에 쓰이는 Receiver가 있습니다. Sender 단에서 값을 보낼 때마다 Some(val)을 내놓고, Sender가 드랍되고 모든 대기 메시지를 다 받았을 때에는 None을 반환합니다.

async fn send_recv() {
    const BUFFER_SIZE: usize = 10;
    let (mut tx, mut rx) = mpsc::channel::<i32>(BUFFER_SIZE);

    tx.send(1).await.unwrap();
    tx.send(2).await.unwrap();
    drop(tx);

    // `StreamExt::next` 는 `Iterator::next`와 같지만, 
    // `Future<Output = Option<T>>`을 구현한 타입을 반환한다.
    assert_eq!(Some(1), rx.next().await);
    assert_eq!(Some(2), rx.next().await);
    assert_eq!(None, rx.next().await);
}