grafos_stream/source.rs
1//! Built-in source implementations.
2//!
3//! | Type | Description |
4//! |------|-------------|
5//! | [`VecSource<T>`] | Produces items from a `Vec<T>` |
6//! | [`IterSource<T, I>`] | Produces items from any iterator |
7
8extern crate alloc;
9use alloc::vec::Vec;
10
11use grafos_std::error::FabricError;
12
13use crate::stage::Source;
14
15/// Source that yields items from a `Vec<T>` in FIFO order.
16///
17/// Items are stored in reverse internally so that `pop()` yields them
18/// front-to-back in O(1) time. Once all items have been yielded,
19/// `next()` returns `Ok(None)`.
20///
21/// # Example
22///
23/// ```rust
24/// use grafos_stream::source::VecSource;
25/// use grafos_stream::stage::Source;
26///
27/// let mut src = VecSource::new(vec![10, 20, 30]);
28/// assert_eq!(src.next().unwrap(), Some(10));
29/// assert_eq!(src.next().unwrap(), Some(20));
30/// assert_eq!(src.next().unwrap(), Some(30));
31/// assert_eq!(src.next().unwrap(), None);
32/// ```
33pub struct VecSource<T> {
34 items: Vec<T>,
35}
36
37impl<T> VecSource<T> {
38 /// Create a source from a vector.
39 ///
40 /// Values are yielded in the same order as the input vector.
41 pub fn new(mut items: Vec<T>) -> Self {
42 items.reverse();
43 VecSource { items }
44 }
45}
46
47impl<T> Source<T> for VecSource<T> {
48 fn next(&mut self) -> Result<Option<T>, FabricError> {
49 Ok(self.items.pop())
50 }
51}
52
53/// Source that yields items from an iterator.
54///
55/// Wraps any `Iterator<Item = T>` as a [`Source<T>`].
56///
57/// # Example
58///
59/// ```rust
60/// use grafos_stream::source::IterSource;
61/// use grafos_stream::stage::Source;
62///
63/// let mut src = IterSource::new(0..3);
64/// assert_eq!(src.next().unwrap(), Some(0));
65/// assert_eq!(src.next().unwrap(), Some(1));
66/// assert_eq!(src.next().unwrap(), Some(2));
67/// assert_eq!(src.next().unwrap(), None);
68/// ```
69pub struct IterSource<T, I: Iterator<Item = T>> {
70 iter: I,
71}
72
73impl<T, I: Iterator<Item = T>> IterSource<T, I> {
74 /// Wrap an iterator as a [`Source`].
75 pub fn new(iter: I) -> Self {
76 IterSource { iter }
77 }
78}
79
80impl<T, I: Iterator<Item = T>> Source<T> for IterSource<T, I> {
81 fn next(&mut self) -> Result<Option<T>, FabricError> {
82 Ok(self.iter.next())
83 }
84}