1use std::io::Read;
2
3pub trait Generator<'a, T>: FnMut() -> Option<T> + 'a {}
5impl<'a, T, R> Generator<'a, R> for T where T: FnMut() -> Option<R> + 'a {}
6
7pub struct StreamReader<'a, T> {
10 generator: Box<dyn Generator<'a, T>>,
11}
12
13impl<'a, T> StreamReader<'a, T> {
14 pub fn new(generator: impl Generator<'a, T>) -> Self {
15 let generator = Box::new(generator);
16 Self { generator }
17 }
18}
19
20impl Read for StreamReader<'_, u8> {
21 fn read(&mut self, buf: &mut [u8]) -> std::io::Result<usize> {
22 for (i, e) in buf.iter_mut().enumerate() {
23 match (self.generator)() {
24 Some(b) => *e = b,
25 None => return Ok(i),
26 }
27 }
28 Ok(buf.len())
29 }
30}