use futures_util::Future;
use crate::{Embedder, EmbedderExt, Embedding, VectorSpace};
pub trait IntoEmbedding<S: VectorSpace> {
fn into_embedding<E: Embedder<VectorSpace = S>>(
self,
embedder: &E,
) -> impl Future<Output = anyhow::Result<Embedding<S>>>;
fn into_query_embedding<E: Embedder<VectorSpace = S>>(
self,
embedder: &E,
) -> impl Future<Output = anyhow::Result<Embedding<S>>>;
}
impl<S: ToString, V: VectorSpace> IntoEmbedding<V> for S {
async fn into_embedding<E: Embedder<VectorSpace = V>>(
self,
embedder: &E,
) -> anyhow::Result<Embedding<V>> {
embedder.embed(self).await
}
async fn into_query_embedding<E: Embedder<VectorSpace = V>>(
self,
embedder: &E,
) -> anyhow::Result<Embedding<V>> {
embedder.embed_query(self).await
}
}
impl<S: VectorSpace> IntoEmbedding<S> for Embedding<S> {
async fn into_embedding<E: Embedder<VectorSpace = S>>(
self,
_: &E,
) -> anyhow::Result<Embedding<S>> {
Ok(self)
}
async fn into_query_embedding<E: Embedder<VectorSpace = S>>(
self,
_: &E,
) -> anyhow::Result<Embedding<S>> {
Ok(self)
}
}