use crate::embedding::EmbeddingSpace;
pub use crate::op::{OpId, OpRef, NoopOpRef};
pub trait Index<S: EmbeddingSpace> {
type Value: Clone;
type SearchType;
type AddType;
type RemoveType;
type TrainType;
type SearchRef<'a>: OpRef where Self: 'a;
type AddRef<'a>: OpRef where Self: 'a;
type RemoveRef<'a>: OpRef where Self: 'a;
type TrainRef<'a>: OpRef where Self: 'a;
type ObserveRef<'a>: OpRef where Self: 'a;
fn search(
&mut self,
search_embedding: &S::EmbeddingData,
search_type: &Self::SearchType,
) -> Self::SearchRef<'_>;
fn add(
&mut self,
embedding: &S::EmbeddingData,
value: Self::Value,
add_type: &Self::AddType,
) -> Self::AddRef<'_>;
fn remove(
&mut self,
embedding: &S::EmbeddingData,
remove_type: &Self::RemoveType,
) -> Self::RemoveRef<'_>;
fn train(
&mut self,
data: &[S::EmbeddingData],
train_type: &Self::TrainType,
) -> Self::TrainRef<'_>;
fn observe(
&mut self,
embedding: &S::EmbeddingData,
) -> Self::ObserveRef<'_>;
fn reset(&mut self);
fn len(&self) -> usize;
fn is_trained(&self) -> bool;
fn is_empty(&self) -> bool;
}
impl<S: EmbeddingSpace> Index<S> for () {
type Value = ();
type SearchType = ();
type AddType = ();
type RemoveType = ();
type TrainType = ();
type SearchRef<'a> = NoopOpRef where Self: 'a;
type AddRef<'a> = NoopOpRef where Self: 'a;
type RemoveRef<'a> = NoopOpRef where Self: 'a;
type TrainRef<'a> = NoopOpRef where Self: 'a;
type ObserveRef<'a> = NoopOpRef where Self: 'a;
fn search(&mut self, _: &S::EmbeddingData, _: &()) -> NoopOpRef { NoopOpRef::new(0) }
fn add(&mut self, _: &S::EmbeddingData, _: (), _: &()) -> NoopOpRef { NoopOpRef::new(0) }
fn remove(&mut self, _: &S::EmbeddingData, _: &()) -> NoopOpRef { NoopOpRef::new(0) }
fn train(&mut self, _: &[S::EmbeddingData], _: &()) -> NoopOpRef { NoopOpRef::new(0) }
fn observe(&mut self, _: &S::EmbeddingData) -> NoopOpRef { NoopOpRef::new(0) }
fn reset(&mut self) {}
fn len(&self) -> usize { 0 }
fn is_trained(&self) -> bool { true }
fn is_empty(&self) -> bool { true }
}