use eye_hal::error::Result;
use eye_hal::stream::Descriptor;
use eye_hal::traits::{Device, Stream};
pub struct Builder<'a> {
dev: &'a dyn Device<'a>,
streams: Vec<Descriptor>,
}
impl<'a> Builder<'a> {
pub(crate) fn new(dev: &'a dyn Device<'a>) -> Result<Self> {
let streams = dev.streams()?;
Ok(Builder { dev, streams })
}
pub fn filter<P>(self, predicate: P) -> Self
where
P: FnMut(&Descriptor) -> bool,
{
Builder {
dev: self.dev,
streams: self.streams.into_iter().filter(predicate).collect(),
}
}
pub fn reduce<F>(self, f: F) -> Option<Blueprint<'a>>
where
F: FnMut(Descriptor, Descriptor) -> Descriptor,
{
match self.streams.into_iter().reduce(f) {
Some(desc) => Some(Blueprint {
dev: self.dev,
desc,
}),
None => None,
}
}
}
pub struct Blueprint<'a> {
dev: &'a dyn Device<'a>,
desc: Descriptor,
}
impl<'a> Blueprint<'a> {
pub fn start(self) -> Result<impl Stream<'a>> {
self.dev.start_stream(&self.desc)
}
}