use std::slice;
use tokio::sync::oneshot;
#[derive(Debug)]
pub enum LoaderOp<K, V> {
Load(LoadRequest<K, V>),
Prime(K, V),
PrimeMany(Vec<(K, V)>),
Clear(K),
ClearMany(Vec<K>),
}
#[derive(Debug)]
pub enum LoadRequest<K, V> {
One(K, oneshot::Sender<Option<V>>),
Many(Vec<K>, oneshot::Sender<Vec<Option<V>>>),
}
impl<K, V> LoadRequest<K, V>
where
V: Send + Clone + std::fmt::Debug,
{
pub fn keys(&self) -> &[K] {
match self {
LoadRequest::One(ref key, _) => slice::from_ref(key),
LoadRequest::Many(ref keys, _) => &keys,
}
}
pub fn send_response<'a, I>(self, values: I)
where
I: IntoIterator<Item = Option<&'a V>>,
V: Send + 'a,
{
match self {
LoadRequest::One(_, response_tx) => {
response_tx
.send(values.into_iter().next().flatten().cloned())
.unwrap();
}
LoadRequest::Many(_, response_tx) => {
response_tx
.send(
values
.into_iter()
.map(|opt| opt.cloned())
.collect::<Vec<_>>(),
)
.unwrap();
}
}
}
}