standing-relations 0.1.2

Standing relations over a shifting dataset optimized for 'feedback loop' scenarios
Documentation
use crate::core::{relation::RelationInner, Op_, Relation};

pub struct Concat<C1: Op_, C2: Op_<T = C1::T>>(RelationInner<C1>, RelationInner<C2>);

impl<C1: Op_, C2: Op_<T = C1::T>> Op_ for Concat<C1, C2> {
    type T = C1::T;

    fn foreach<'a>(&'a mut self, mut continuation: impl FnMut(Self::T) + 'a) {
        self.0.foreach(&mut continuation);
        self.1.foreach(continuation);
    }
    fn get_type_name() -> &'static str {
        "concat"
    }
}

impl<C1: Op_> Relation<C1> {
    pub fn concat<C2: Op_<T = C1::T>>(self, other: Relation<C2>) -> Relation<Concat<C1, C2>> {
        assert_eq!(
            self.context_tracker, other.context_tracker,
            "Context mismatch"
        );
        self.context_tracker.add_relation(
            self.dirty.or(other.dirty),
            Concat(self.inner, other.inner),
            vec![self.tracking_index, other.tracking_index],
        )
    }
}