use std::sync::Arc;
use std::sync::RwLock;
use async_trait::async_trait;
#[derive(Debug)]
pub struct TestError;
impl<Id> From<crate::Error<Id>> for TestError
where
Id: crate::NodeId,
{
fn from(_ce: crate::Error<Id>) -> Self {
TestError
}
}
#[derive(Copy, Clone, Eq, PartialEq, std::hash::Hash, Debug)]
pub struct Id(pub(crate) usize);
impl crate::NodeId for Id {}
#[derive(Clone, Debug)]
pub struct Node {
pub(crate) parents: Vec<Id>,
pub(crate) data: usize,
}
impl crate::Node for Node {
type Id = Id;
fn parent_ids(&self) -> Vec<Self::Id> {
self.parents.clone()
}
}
#[derive(Clone, Debug)]
pub struct Backend(pub(crate) Arc<RwLock<Vec<Option<Node>>>>);
impl Backend {
pub fn new(v: Vec<Option<Node>>) -> Self {
Backend(Arc::new(RwLock::new(v)))
}
}
#[async_trait]
impl crate::DagBackend<Id, Node> for Backend {
type Error = TestError;
async fn get(&self, id: Id) -> Result<Option<(Id, Node)>, Self::Error> {
if self.0.read().unwrap().len() < id.0 + 1 {
Ok(None)
} else {
Ok(self.0.read().unwrap()[id.0].clone().map(|node| (id, node)))
}
}
async fn put(&mut self, node: Node) -> Result<Id, Self::Error> {
while self.0.read().unwrap().len() < node.data + 1 {
self.0.write().unwrap().push(None)
}
let idx = node.data;
self.0.write().unwrap()[idx] = Some(node);
Ok(Id(idx))
}
}