#![allow(missing_docs)]
use crate::Database;
use crate::Query;
use crate::QueryTable;
use crate::QueryTableMut;
use crate::SweepStrategy;
use std::fmt::Debug;
use std::hash::Hash;
pub use crate::derived::DependencyStorage;
pub use crate::derived::MemoizedStorage;
pub use crate::derived::VolatileStorage;
pub use crate::input::InputStorage;
pub use crate::runtime::Revision;
pub struct CycleDetected;
pub trait DatabaseStorageTypes: Sized {
type QueryDescriptor: QueryDescriptor<Self>;
type DatabaseStorage: Default;
}
pub trait DatabaseOps: Sized {
fn for_each_query(&self, op: impl FnMut(&dyn QueryStorageMassOps<Self>));
}
pub trait QueryStorageMassOps<DB: Database> {
fn sweep(&self, db: &DB, strategy: SweepStrategy);
}
pub trait QueryDescriptor<DB>: Clone + Debug + Eq + Hash + Send + Sync {
fn maybe_changed_since(&self, db: &DB, revision: Revision) -> bool;
}
pub trait QueryFunction<DB: Database>: Query<DB> {
fn execute(db: &DB, key: Self::Key) -> Self::Value;
}
pub trait GetQueryTable<Q: Query<Self>>: Database {
fn get_query_table(db: &Self) -> QueryTable<'_, Self, Q>;
fn get_query_table_mut(db: &mut Self) -> QueryTableMut<'_, Self, Q>;
fn descriptor(db: &Self, key: Q::Key) -> Self::QueryDescriptor;
}
pub trait QueryStorageOps<DB, Q>: Default
where
DB: Database,
Q: Query<DB>,
{
fn try_fetch(
&self,
db: &DB,
key: &Q::Key,
descriptor: &DB::QueryDescriptor,
) -> Result<Q::Value, CycleDetected>;
fn maybe_changed_since(
&self,
db: &DB,
revision: Revision,
key: &Q::Key,
descriptor: &DB::QueryDescriptor,
) -> bool;
fn is_constant(&self, db: &DB, key: &Q::Key) -> bool;
fn keys<C>(&self, db: &DB) -> C
where
C: std::iter::FromIterator<Q::Key>;
}
pub trait InputQueryStorageOps<DB, Q>: Default
where
DB: Database,
Q: Query<DB>,
{
fn set(&self, db: &DB, key: &Q::Key, descriptor: &DB::QueryDescriptor, new_value: Q::Value);
fn set_constant(
&self,
db: &DB,
key: &Q::Key,
descriptor: &DB::QueryDescriptor,
new_value: Q::Value,
);
}
pub trait UncheckedMutQueryStorageOps<DB, Q>: Default
where
DB: Database,
Q: Query<DB>,
{
fn set_unchecked(&self, db: &DB, key: &Q::Key, new_value: Q::Value);
}