1 use crate::Stream;
2 use std::pin::Pin;
3 use std::task::{Context, Poll};
4 use tokio::time::{Instant, Interval};
5 
6 /// A wrapper around [`Interval`] that implements [`Stream`].
7 ///
8 /// [`Interval`]: struct@tokio::time::Interval
9 /// [`Stream`]: trait@crate::Stream
10 #[derive(Debug)]
11 #[cfg_attr(docsrs, doc(cfg(feature = "time")))]
12 pub struct IntervalStream {
13     inner: Interval,
14 }
15 
16 impl IntervalStream {
17     /// Create a new `IntervalStream`.
new(interval: Interval) -> Self18     pub fn new(interval: Interval) -> Self {
19         Self { inner: interval }
20     }
21 
22     /// Get back the inner `Interval`.
into_inner(self) -> Interval23     pub fn into_inner(self) -> Interval {
24         self.inner
25     }
26 }
27 
28 impl Stream for IntervalStream {
29     type Item = Instant;
30 
poll_next(mut self: Pin<&mut Self>, cx: &mut Context<'_>) -> Poll<Option<Instant>>31     fn poll_next(mut self: Pin<&mut Self>, cx: &mut Context<'_>) -> Poll<Option<Instant>> {
32         self.inner.poll_tick(cx).map(Some)
33     }
34 
size_hint(&self) -> (usize, Option<usize>)35     fn size_hint(&self) -> (usize, Option<usize>) {
36         (usize::MAX, None)
37     }
38 }
39 
40 impl AsRef<Interval> for IntervalStream {
as_ref(&self) -> &Interval41     fn as_ref(&self) -> &Interval {
42         &self.inner
43     }
44 }
45 
46 impl AsMut<Interval> for IntervalStream {
as_mut(&mut self) -> &mut Interval47     fn as_mut(&mut self) -> &mut Interval {
48         &mut self.inner
49     }
50 }
51