eye 0.5.0

Cross platform camera capture and control
Documentation
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)
    }
}