use std::future::Future;
use std::pin::Pin;
use std::sync::Arc;
use crate::error::Result;
pub trait EmbeddingModel: Send + Sync {
fn embed(&self, texts: &[&str]) -> impl Future<Output = Result<Vec<Vec<f32>>>> + Send;
fn dimensions(&self) -> usize;
}
pub trait ErasedEmbeddingModel: Send + Sync {
fn embed_erased<'a>(
&'a self,
texts: &'a [&'a str],
) -> Pin<Box<dyn Future<Output = Result<Vec<Vec<f32>>>> + Send + 'a>>;
fn dimensions(&self) -> usize;
}
impl<T: EmbeddingModel> ErasedEmbeddingModel for T {
fn embed_erased<'a>(
&'a self,
texts: &'a [&'a str],
) -> Pin<Box<dyn Future<Output = Result<Vec<Vec<f32>>>> + Send + 'a>> {
Box::pin(self.embed(texts))
}
fn dimensions(&self) -> usize {
EmbeddingModel::dimensions(self)
}
}
pub type SharedEmbeddingModel = Arc<dyn ErasedEmbeddingModel>;