use super::{event_to_sync_upsert_op, Channel};
use crate::error::ImError;
use crate::state::{Cursor, Seq};
use helix_core::effect::StorageOp;
use helix_core::EffectSink;
impl Channel {
pub fn peek_up_to(&self, target_seq: Seq) -> Vec<StorageOp> {
self.buffer
.range(..=target_seq)
.map(|(_, ev)| event_to_sync_upsert_op(ev))
.collect()
}
pub(super) fn commit_cursor(&mut self, target_seq: Seq) -> Result<bool, ImError> {
let committed = self.cursor.try_advance(target_seq);
if committed {
self.buffer.retain(|&seq, _| seq > target_seq);
}
Ok(committed)
}
pub fn reset_for_too_long(&mut self, reset_to: Seq, fx: &mut EffectSink) {
self.buffer.clear();
self.gate = None;
let reset_cursor = Seq(reset_to.0.saturating_sub(1));
self.cursor = Cursor::new(reset_cursor);
fx.push(crate::acl::to_effect::advance_cursor(self.id, reset_cursor));
}
pub(crate) fn commit_too_long_after_atomic(&mut self, target_seq: Seq) -> bool {
if self.is_terminal() || target_seq < self.cursor.value() {
return false;
}
self.cursor.try_advance(target_seq);
self.buffer.clear();
self.gate = None;
self.last_sync_from_seq = None;
true
}
}