use crate::{AttrId, EntityId, TxId, Value, encoding::Encodable};
#[derive(Clone, Debug, Eq, PartialEq)]
pub struct Datom {
pub e: EntityId,
pub a: AttrId,
pub v: Value,
pub tx: TxId,
pub added: bool,
}
#[derive(Clone, Copy, Debug, Eq, PartialEq)]
pub enum IndexOrder {
Eavt,
Aevt,
Avet,
Vaet,
}
impl Datom {
#[must_use]
pub fn key(&self, order: IndexOrder) -> Vec<u8> {
let mut out = Vec::new();
match order {
IndexOrder::Eavt => {
self.e.encode_into(&mut out);
self.a.encode_into(&mut out);
self.v.encode_into(&mut out);
}
IndexOrder::Aevt => {
self.a.encode_into(&mut out);
self.e.encode_into(&mut out);
self.v.encode_into(&mut out);
}
IndexOrder::Avet => {
self.a.encode_into(&mut out);
self.v.encode_into(&mut out);
self.e.encode_into(&mut out);
}
IndexOrder::Vaet => {
self.v.encode_into(&mut out);
self.a.encode_into(&mut out);
self.e.encode_into(&mut out);
}
}
encode_tx_added(self.tx, self.added, &mut out);
out
}
}
fn encode_tx_added(tx: TxId, added: bool, out: &mut Vec<u8>) {
((tx.raw() << 1) | u64::from(added)).encode_into(out);
}