pub use self::iterate::Iterate;
pub use self::count::CountTotal;
pub use self::threshold::ThresholdTotal;
pub mod arrange;
pub mod common;
pub mod int_proxy;
pub mod reduce;
pub mod iterate;
pub mod join;
pub mod count;
pub mod threshold;
use crate::lattice::Lattice;
use crate::trace::Cursor;
pub struct EditList<V, T, D> {
values: Vec<(V, usize)>,
edits: Vec<(T, D)>,
}
impl<V: Copy, T: Ord + Lattice, D: crate::difference::Semigroup> EditList<V, T, D> {
#[inline]
fn new() -> Self {
EditList {
values: Vec::new(),
edits: Vec::new(),
}
}
fn load<'a, C>(&mut self, cursor: &mut C, storage: &'a C::Storage, meet: Option<&T>)
where
C: Cursor<Val<'a> = V, Time = T, Diff = D>,
{
self.clear();
while let Some(val) = cursor.get_val(storage) {
cursor.map_times(storage, |time, diff| {
let mut t = C::owned_time(time);
if let Some(m) = meet { t.join_assign(m); }
self.push(t, C::owned_diff(diff));
});
self.seal(val);
cursor.step_val(storage);
}
}
#[inline]
pub fn clear(&mut self) {
self.values.clear();
self.edits.clear();
}
fn len(&self) -> usize { self.edits.len() }
#[inline]
pub fn push(&mut self, time: T, diff: D) {
self.edits.push((time, diff));
}
#[inline]
pub fn seal(&mut self, value: V) {
let prev = self.values.last().map(|x| x.1).unwrap_or(0);
crate::consolidation::consolidate_from(&mut self.edits, prev);
if self.edits.len() > prev {
self.values.push((value, self.edits.len()));
}
}
fn map<F: FnMut(V, &T, &D)>(&self, mut logic: F) {
for index in 0 .. self.values.len() {
let lower = if index == 0 { 0 } else { self.values[index-1].1 };
let upper = self.values[index].1;
for edit in lower .. upper {
logic(self.values[index].0, &self.edits[edit].0, &self.edits[edit].1);
}
}
}
}
pub struct ValueHistory<V, T, D> {
edits: EditList<V, T, D>,
history: Vec<(T, T, usize, usize)>, buffer: Vec<((V, T), D)>, }
impl<V: Copy + Ord, T: Ord + Clone + Lattice, D: crate::difference::Semigroup> ValueHistory<V, T, D> {
pub fn new() -> Self {
ValueHistory {
edits: EditList::new(),
history: Vec::new(),
buffer: Vec::new(),
}
}
pub fn clear(&mut self) {
self.edits.clear();
self.history.clear();
self.buffer.clear();
}
fn replay_key<'a, 'history, C>(
&'history mut self,
cursor: &mut C,
storage: &'a C::Storage,
key: C::Key<'a>,
meet: Option<&T>,
) -> HistoryReplay<'history, V, T, D>
where
C: Cursor<Val<'a> = V, Time = T, Diff = D>,
{
self.clear();
cursor.populate_key(storage, key, meet, &mut self.edits);
self.replay()
}
fn walk<'history>(&'history mut self) -> HistoryReplay<'history, V, T, D> {
self.buffer.clear();
HistoryReplay { replay: self }
}
fn replay_times<'history>(&'history self, buffer: &'history mut Vec<T>) -> TimeReplay<'history, T> {
buffer.clear();
TimeReplay { history: &self.history[..], buffer }
}
fn build(&mut self) {
self.buffer.clear();
self.history.clear();
for value_index in 0 .. self.edits.values.len() {
let lower = if value_index > 0 { self.edits.values[value_index-1].1 } else { 0 };
let upper = self.edits.values[value_index].1;
for edit_index in lower .. upper {
let time = self.edits.edits[edit_index].0.clone();
self.history.push((time.clone(), time, value_index, edit_index));
}
}
self.history.sort_by(|x,y| y.cmp(x));
self.history.iter_mut().reduce(|prev, cur| { cur.1.meet_assign(&prev.1); cur });
}
fn replay<'history>(&'history mut self) -> HistoryReplay<'history, V, T, D> {
self.build();
HistoryReplay { replay: self }
}
pub fn load_iter(&mut self, edits: impl Iterator<Item = (V, T, D)>, advance_by: Option<&T>) {
self.edits.clear();
let mut cur: Option<V> = None;
for (v, mut time, diff) in edits {
if cur != Some(v) {
if let Some(pv) = cur { self.edits.seal(pv); }
cur = Some(v);
}
if let Some(m) = advance_by { time.join_assign(m); }
self.edits.push(time, diff);
}
if let Some(pv) = cur { self.edits.seal(pv); }
self.build();
}
}
impl<V: Copy + Ord, T: Ord + Clone + Lattice, D: Clone + crate::difference::Semigroup> ValueHistory<V, T, D> {
pub fn time(&self) -> Option<&T> { self.history.last().map(|x| &x.0) }
pub fn meet(&self) -> Option<&T> { self.history.last().map(|x| &x.1) }
pub fn edit(&self) -> Option<(V, &T, &D)> {
self.history.last().map(|&(ref t, _, v, e)| (self.edits.values[v].0, t, &self.edits.edits[e].1))
}
pub fn buffer(&self) -> &[((V, T), D)] { &self.buffer[..] }
pub fn step(&mut self) {
let (time, _, value_index, edit_offset) = self.history.pop().unwrap();
self.buffer.push(((self.edits.values[value_index].0, time), self.edits.edits[edit_offset].1.clone()));
}
pub fn step_while_time_is(&mut self, time: &T) -> bool {
let mut found = false;
while self.time() == Some(time) { found = true; self.step(); }
found
}
pub fn step_through(&mut self, time: &T) {
while self.time().is_some_and(|t| t <= time) { self.step(); }
}
pub fn advance_buffer_by(&mut self, meet: &T) {
for element in self.buffer.iter_mut() { (element.0).1.join_assign(meet); }
crate::consolidation::consolidate(&mut self.buffer);
}
pub fn is_done(&self) -> bool { self.history.is_empty() }
}
struct HistoryReplay<'history, V, T, D> {
replay: &'history mut ValueHistory<V, T, D>,
}
impl<'history, V: Copy + Ord, T: Ord + Clone + Lattice, D: Clone + crate::difference::Semigroup> HistoryReplay<'history, V, T, D> {
fn time(&self) -> Option<&T> { self.replay.time() }
fn meet(&self) -> Option<&T> { self.replay.meet() }
fn edit(&self) -> Option<(V, &T, &D)> { self.replay.edit() }
fn buffer(&self) -> &[((V, T), D)] { self.replay.buffer() }
fn step(&mut self) { self.replay.step() }
fn step_while_time_is(&mut self, time: &T) -> bool { self.replay.step_while_time_is(time) }
fn advance_buffer_by(&mut self, meet: &T) { self.replay.advance_buffer_by(meet) }
fn is_done(&self) -> bool { self.replay.is_done() }
}
struct TimeReplay<'history, T> {
history: &'history [(T, T, usize, usize)], buffer: &'history mut Vec<T>, }
impl<'history, T: Ord + Clone + Lattice> TimeReplay<'history, T> {
fn time(&self) -> Option<&T> { self.history.last().map(|entry| &entry.0) }
fn meet(&self) -> Option<&T> { self.history.last().map(|entry| &entry.1) }
fn step(&mut self) {
let last = self.history.len() - 1;
self.buffer.push(self.history[last].0.clone());
self.history = &self.history[..last];
}
fn step_while_time_is(&mut self, time: &T) -> bool {
let mut found = false;
while self.time() == Some(time) {
found = true;
self.step();
}
found
}
fn advance_buffer_by(&mut self, meet: &T) {
for time in self.buffer.iter_mut() { time.join_assign(meet); }
self.buffer.sort();
self.buffer.dedup();
}
fn buffer(&self) -> &[T] { &self.buffer[..] }
}