Skip to main content

rx_rust/operators/creating/
range.rs

1use crate::operators::creating::from_iter::FromIter;
2use crate::utils::types::MaybeSend;
3use crate::{
4    observable::{Observable, Subscription},
5    observer::Observer,
6};
7use educe::Educe;
8use std::convert::Infallible;
9
10/// Creates an Observable that emits a sequence of integers within a specified range.
11/// See <https://reactivex.io/documentation/operators/range.html>
12///
13/// # Examples
14/// ```rust
15/// use rx_rust::{
16///     observable::ObservableExt,
17///     observer::Termination,
18///     operators::creating::range::Range,
19/// };
20///
21/// let mut values = Vec::new();
22/// let mut terminations = Vec::new();
23///
24/// Range::new(1..=3).subscribe_with_callback(
25///     |value| values.push(value),
26///     |termination| terminations.push(termination),
27/// );
28///
29/// assert_eq!(values, vec![1, 2, 3]);
30/// assert_eq!(terminations, vec![Termination::Completed]);
31/// ```
32#[derive(Educe)]
33#[educe(Debug, Clone)]
34pub struct Range<I>(I);
35
36impl<I> Range<I> {
37    pub fn new(range: I) -> Self {
38        Self(range)
39    }
40}
41
42impl<'or, T, I> Observable<'or, T, Infallible> for Range<I>
43where
44    I: IntoIterator<Item = T>,
45{
46    type D = ();
47
48    fn subscribe(
49        self,
50        observer: impl Observer<T, Infallible> + MaybeSend + 'or,
51    ) -> Subscription<Self::D> {
52        FromIter::new(self.0).subscribe(observer)
53    }
54}