use std::fmt::Debug;
use columnar::Columnar;
use crate::trace::implementations::{Layout, OffsetList};
use crate::difference::Semigroup;
use crate::lattice::Lattice;
use timely::progress::Timestamp;
pub struct ColumnarLayout<U: ColumnarUpdate> {
phantom: std::marker::PhantomData<U>,
}
impl<K, V, T, R> ColumnarUpdate for (K, V, T, R)
where
K: Columnar<Container: OrdContainer + Debug + Default> + Debug + Ord + Clone + 'static,
V: Columnar<Container: OrdContainer + Debug + Default> + Debug + Ord + Clone + 'static,
T: Columnar<Container: OrdContainer + Debug + Default> + Debug + Ord + Default + Clone + Lattice + Timestamp,
R: Columnar<Container: OrdContainer + Debug + Default> + Debug + Ord + Default + Semigroup + 'static,
{
type Key = K;
type Val = V;
type Time = T;
type Diff = R;
}
impl<U: ColumnarUpdate> Layout for ColumnarLayout<U> {
type KeyContainer = super::arrangement::Coltainer<U::Key>;
type ValContainer = super::arrangement::Coltainer<U::Val>;
type TimeContainer = super::arrangement::Coltainer<U::Time>;
type DiffContainer = super::arrangement::Coltainer<U::Diff>;
type OffsetContainer = OffsetList;
}
pub trait ColumnarUpdate : Debug + 'static {
type Key: Columnar<Container: OrdContainer + Debug + Default> + Debug + Ord + Clone + 'static;
type Val: Columnar<Container: OrdContainer + Debug + Default> + Debug + Ord + Clone + 'static;
type Time: Columnar<Container: OrdContainer + Debug + Default> + Debug + Ord + Default + Clone + Lattice + Timestamp;
type Diff: Columnar<Container: OrdContainer + Debug + Default> + Debug + Ord + Default + Semigroup + 'static;
}
pub trait OrdContainer : for<'a> columnar::Container<Ref<'a> : Ord> { }
impl<C: for<'a> columnar::Container<Ref<'a> : Ord>> OrdContainer for C { }