use std::ops::Range;
use async_trait::async_trait;
#[async_trait]
pub trait Storage {
type Record;
type Query;
async fn save(&mut self, records: &mut Vec<Self::Record>);
async fn load(&mut self, query: Self::Query) -> Vec<Self::Record>;
}
#[async_trait]
impl<T> Storage for Vec<T>
where
T: Send + Clone,
{
type Query = Range<usize>;
type Record = T;
async fn save(&mut self, records: &mut Vec<T>) {
self.append(records);
}
async fn load(&mut self, query: Range<usize>) -> Vec<T> {
self[query].to_owned()
}
}
#[async_trait]
impl<Q, R> Storage for Box<dyn Storage<Query = Q, Record = R> + Send> where Q: Send, R: Send {
type Query = Q;
type Record = R;
async fn save(&mut self, records: &mut Vec<R>) {
(**self).save(records).await
}
async fn load(&mut self, query: Q) -> Vec<R> {
(**self).load(query).await
}
}