use super::super::traits::*;
use std::mem;
pub struct InMemoryPendingLog<Edit, CommitFn> {
pending: Vec<Edit>,
on_commit: CommitFn
}
impl<Edit, CommitFn> InMemoryPendingLog<Edit, CommitFn>
where CommitFn: FnMut(Vec<Edit>) -> () {
pub fn new(on_commit: CommitFn) -> InMemoryPendingLog<Edit, CommitFn> {
InMemoryPendingLog {
pending: vec![],
on_commit: on_commit
}
}
}
impl<Edit: Clone, CommitFn> PendingEditLog<Edit> for InMemoryPendingLog<Edit, CommitFn>
where CommitFn: FnMut(Vec<Edit>) -> () {
fn pending(&self) -> Vec<Edit> {
self.pending.clone()
}
fn set_pending(&mut self, edits: &[Edit]) {
self.pending = edits.iter().map(|edit| edit.clone()).collect();
}
fn commit_pending(&mut self) {
let mut pending = vec![];
mem::swap(&mut pending, &mut self.pending);
(self.on_commit)(pending);
}
fn cancel_pending(&mut self) {
self.pending = vec![];
}
}