use crate::{
index::{FieldReader, TransactionList},
object::{self, AEADReader, Pool},
};
use serde::{de::DeserializeOwned, Serialize};
use std::{cmp::Eq, hash::Hash, sync::Arc};
pub trait Value: Serialize + DeserializeOwned + Send + Sync {}
pub trait Key: Serialize + DeserializeOwned + Eq + Hash + Send + Sync {}
impl<T> Value for T where T: Serialize + DeserializeOwned + Send + Sync {}
impl<T> Key for T where T: Serialize + DeserializeOwned + Eq + Hash + Send + Sync {}
mod map;
pub use map::Map;
mod list;
pub use list::List;
mod query;
pub use query::*;
mod serialized;
pub use serialized::Serialized;
mod versioned;
pub use versioned::list::LinkedList;
pub use versioned::map::VersionedMap;
pub mod depth;
use depth::Depth;
pub mod strategy;
#[allow(unused)]
pub(crate) use strategy::Strategy;
pub use strategy::{LocalField, SparseField};
pub mod intent;
pub use intent::{Intent, Load, Query, Store};
pub trait Collection {
type Depth: Depth;
type Key;
type Serialized: DeserializeOwned;
type Item;
fn key(from: &Self::Serialized) -> &Self::Key;
fn load(from: Self::Serialized, object: &mut dyn object::Reader) -> Self::Item;
fn insert(&mut self, record: Self::Item);
}
impl<T> Query for T
where
T: Collection,
{
type Key = T::Key;
fn select(
&mut self,
pool: Pool<AEADReader>,
transaction_list: TransactionList,
predicate: impl Fn(&Self::Key) -> QueryAction,
) {
let predicate = Arc::new(predicate);
let mut reader = pool.lease().unwrap();
for transaction in T::Depth::resolve(pool, transaction_list) {
let iter = QueryIterator::new(transaction, &mut reader, predicate.clone(), self);
for item in iter {
self.insert(item);
}
}
}
}
impl<T: Collection> Collection for LocalField<T> {
type Depth = T::Depth;
type Key = T::Key;
type Serialized = T::Serialized;
type Item = T::Item;
fn key(from: &Self::Serialized) -> &Self::Key {
T::key(from)
}
fn load(from: Self::Serialized, object: &mut dyn object::Reader) -> Self::Item {
T::load(from, object)
}
fn insert(&mut self, record: Self::Item) {
self.field.insert(record)
}
}