36 lines
917 B
Rust
36 lines
917 B
Rust
use crate::op_tree::OpTreeNode;
|
|
use crate::query::{QueryResult, TreeQuery};
|
|
use crate::types::{ElemId, Op};
|
|
use std::fmt::Debug;
|
|
|
|
#[derive(Debug, Clone, PartialEq)]
|
|
pub(crate) struct ListVals {
|
|
last_elem: Option<ElemId>,
|
|
pub(crate) ops: Vec<Op>,
|
|
}
|
|
|
|
impl ListVals {
|
|
pub(crate) fn new() -> Self {
|
|
ListVals {
|
|
last_elem: None,
|
|
ops: vec![],
|
|
}
|
|
}
|
|
}
|
|
|
|
impl<'a> TreeQuery<'a> for ListVals {
|
|
fn query_node(&mut self, child: &OpTreeNode, ops: &[Op]) -> QueryResult {
|
|
let start = 0;
|
|
for pos in start..child.len() {
|
|
let op = &ops[child.get(pos).unwrap()];
|
|
if op.insert {
|
|
self.last_elem = None;
|
|
}
|
|
if self.last_elem.is_none() && op.visible() {
|
|
self.last_elem = op.elemid();
|
|
self.ops.push(op.clone());
|
|
}
|
|
}
|
|
QueryResult::Finish
|
|
}
|
|
}
|