use std::future::Future;
use std::pin::Pin;
use std::sync::Arc;
use crate::error::Result;
use crate::retriever::types::Document;
pub trait Retriever: Send + Sync {
fn retrieve(
&self,
query: &str,
top_k: usize,
) -> impl Future<Output = Result<Vec<Document>>> + Send;
}
pub trait ErasedRetriever: Send + Sync {
fn retrieve_erased<'a>(
&'a self,
query: &'a str,
top_k: usize,
) -> Pin<Box<dyn Future<Output = Result<Vec<Document>>> + Send + 'a>>;
}
impl<T: Retriever> ErasedRetriever for T {
fn retrieve_erased<'a>(
&'a self,
query: &'a str,
top_k: usize,
) -> Pin<Box<dyn Future<Output = Result<Vec<Document>>> + Send + 'a>> {
Box::pin(self.retrieve(query, top_k))
}
}
pub type SharedRetriever = Arc<dyn ErasedRetriever>;