rdf_types/dataset/
async.rs1use futures_lite::{Stream, StreamExt, stream};
4
5use crate::{
6 Quad,
7 dataset::fallible::{TryDataset, TryDatasetMut, TryFiniteDataset, TryPatternMatchingDataset},
8 pattern::LinearQuadPattern,
9};
10
11pub trait AsyncFiniteDataset: TryDataset {
13 type AsyncQuads<'a>: Stream<Item = Result<Quad<Self::Resource>, Self::Error>>
15 where
16 Self: 'a;
17
18 async fn async_quads(&self) -> Result<Self::AsyncQuads<'_>, Self::Error>;
20}
21
22impl<D: TryFiniteDataset> AsyncFiniteDataset for D {
25 type AsyncQuads<'a>
26 = stream::Iter<D::TryQuads<'a>>
27 where
28 Self: 'a;
29
30 async fn async_quads(&self) -> Result<Self::AsyncQuads<'_>, Self::Error> {
31 self.try_quads().map(stream::iter)
32 }
33}
34
35pub trait AsyncPatternMatchingDataset: TryDataset {
37 type AsyncQuadPatternMatching<'a, 'p>: Stream<Item = Result<Quad<Self::Resource>, Self::Error>>
39 where
40 Self: 'a,
41 Self::Resource: 'p;
42
43 async fn async_quad_pattern_matching<'p>(
46 &self,
47 pattern: LinearQuadPattern<&'p Self::Resource>,
48 ) -> Result<Self::AsyncQuadPatternMatching<'_, 'p>, Self::Error>;
49
50 async fn async_contains_quad(&self, quad: Quad<&Self::Resource>) -> Result<bool, Self::Error> {
52 let mut stream = std::pin::pin!(self.async_quad_pattern_matching(quad.into()).await?);
53 Ok(stream.next().await.transpose()?.is_some())
54 }
55}
56
57impl<D: TryPatternMatchingDataset> AsyncPatternMatchingDataset for D {
60 type AsyncQuadPatternMatching<'a, 'p>
61 = stream::Iter<D::TryQuadPatternMatching<'a, 'p>>
62 where
63 Self: 'a,
64 Self::Resource: 'p;
65
66 async fn async_quad_pattern_matching<'p>(
67 &self,
68 pattern: LinearQuadPattern<&'p Self::Resource>,
69 ) -> Result<Self::AsyncQuadPatternMatching<'_, 'p>, Self::Error> {
70 self.try_quad_pattern_matching(pattern).map(stream::iter)
71 }
72}
73
74pub trait AsyncDatasetMut: TryDataset {
76 async fn async_insert(&mut self, quad: Quad<Self::Resource>) -> Result<(), Self::Error>;
78}
79
80impl<D: TryDatasetMut> AsyncDatasetMut for D {
83 async fn async_insert(&mut self, quad: Quad<Self::Resource>) -> Result<(), Self::Error> {
84 self.try_insert(quad)
85 }
86}