use std::collections::BTreeSet;
use crate::error::Result;
use crate::tuple::Tuple;
pub trait Store {
fn inp(&mut self, tup: &Tuple) -> Result<Option<Tuple>>;
fn rdp(&mut self, tup: &Tuple) -> Result<Option<Tuple>>;
fn out(&mut self, tup: Tuple) -> Result<()>;
}
#[derive(Default)]
pub struct SimpleStore(BTreeSet<Tuple>);
impl SimpleStore {
pub fn new() -> SimpleStore {
SimpleStore(BTreeSet::new())
}
pub fn len(&self) -> usize {
self.0.len()
}
pub fn is_empty(&self) -> bool {
self.0.len() == 0
}
}
impl Store for SimpleStore {
fn out(&mut self, tup: Tuple) -> Result<()> {
if !tup.is_defined() {
bail!("cannot write an undefined tuple");
}
self.0.insert(tup);
Ok(())
}
fn rdp(&mut self, tup: &Tuple) -> Result<Option<Tuple>> {
if tup.is_defined() && self.0.contains(tup) {
return Ok(Some(tup.clone()));
}
for m in self.0.range(tup.range()) {
if tup.matches(m) {
return Ok(Some(m.clone()));
}
}
Ok(Some(tuple![]))
}
fn inp(&mut self, tup: &Tuple) -> Result<Option<Tuple>> {
if tup.is_defined() {
return Ok(self.0.take(tup));
}
let mut result = None;
for m in self.0.range(tup.range()) {
println!("check whether {} matches {}", tup, m);
if tup.matches(m) {
result = Some(m.clone());
break;
}
}
println!("result: {:?}", result);
if let Some(ref m) = result {
return Ok(self.0.take(m));
}
Ok(Some(tuple![]))
}
}