mako 0.3.0

Mako is the main Sidekick AI data processing library
Documentation
use std::marker::PhantomData;
use super::super::{Connector, Node, Stateless};

pub struct Stateful<I, O, S, F: Fn(Vec<I>, &mut S) -> Vec<O>> {
    _phantom: PhantomData<(I, O)>,
    function: F,
    state: S
}

impl <I, O, S, F: Fn(Vec<I>, &mut S) -> Vec<O>>Stateful<I, O, S, F> {
    pub fn new(function: F, state: S) -> Self {
        Stateful {
            _phantom: PhantomData::default(),
            function,
            state
        }
    }

    pub fn add_node<N: Node<Input = O>>(self, node: N) -> Connector<Self, N> {
        Connector::new(self, node)
    }

    pub fn add_fn<NO, F1: Fn(Vec<O>) -> Vec<NO>>(self, function: F1) -> Connector<Self, Stateless<O, NO, F1>> {
        Connector::new(
            self,
            Stateless::new(function)
        )
    }
}

impl <I, O, S, F: Fn(Vec<I>, &mut S) -> Vec<O>>Node for Stateful<I, O, S, F> {
    type Input = I;
    type Output = O;

    fn process(&mut self, input: Vec<Self::Input>) -> Vec<Self::Output> {
        (self.function)(input, &mut self.state)
    }
}