use super::Cursor;
pub struct KeyViewer<'a, C: Cursor+'a> {
active: bool, cursor: &'a mut C,
}
impl<'a, C: Cursor+'a> KeyViewer<'a, C> {
pub fn new(cursor: &'a mut C) -> Self { KeyViewer { active: false, cursor: cursor } }
pub fn next_key<'b>(&'b mut self) -> Option<ValViewer<'b, C>> where 'a : 'b {
if self.active {
self.cursor.step_key();
}
else {
self.active = true;
}
if self.cursor.key_valid() {
Some(ValViewer { active: false, cursor: self.cursor })
}
else {
None
}
}
pub fn seek_key<'b>(&'b mut self, key: &C::Key) -> Option<ValViewer<'b, C>> where 'a : 'b {
self.cursor.seek_key(key);
if self.cursor.key_valid() {
Some(ValViewer { active: false, cursor: self.cursor })
}
else {
None
}
}
pub fn peek_key(&self) -> Option<&C::Key> {
self.cursor.peek_key()
}
pub fn rewind(&mut self) {
self.active = false;
self.cursor.rewind_keys();
}
}
pub struct ValViewer<'a, C: Cursor+'a> {
active: bool, cursor: &'a mut C,
}
impl<'a, C: Cursor+'a> ValViewer<'a, C> {
pub fn next_val<'b>(&'b mut self) -> Option<TimeViewer<'b, C>> {
if self.active {
self.cursor.step_val();
}
else {
self.active = true;
}
if self.cursor.val_valid() {
Some(TimeViewer { cursor: &mut *self.cursor })
}
else {
None
}
}
pub fn seek_val<'b>(&'b mut self, val: &C::Val) -> Option<TimeViewer<'b, C>> {
self.cursor.seek_val(val);
if self.cursor.val_valid() {
Some(TimeViewer { cursor: &mut *self.cursor })
}
else {
None
}
}
pub fn peek_val(&self) -> Option<&C::Val> {
self.cursor.peek_val()
}
pub fn rewind(&mut self) {
self.active = false;
self.cursor.rewind_vals();
}
pub fn key(&self) -> &C::Key { self.cursor.key() }
}
pub struct TimeViewer<'a, C: Cursor+'a> {
cursor: &'a mut C,
}
impl<'a, C: Cursor+'a> TimeViewer<'a, C> {
pub fn key(&self) -> &C::Key { self.cursor.key() }
pub fn val(&self) -> &C::Val { self.cursor.val() }
pub fn map<L: FnMut(&C::Time, isize)>(&mut self, logic: L) {
self.cursor.map_times(logic);
}
}