Skip to main content

rdf_types/dataset/
async.rs

1//! Asynchronous counterparts of the [`Dataset`](super::Dataset) traits, for
2//! datasets backed by asynchronous storage.
3use futures_lite::{Stream, StreamExt, stream};
4
5use crate::{
6	Quad,
7	dataset::fallible::{TryDataset, TryDatasetMut, TryFiniteDataset, TryPatternMatchingDataset},
8	pattern::LinearQuadPattern,
9};
10
11/// Async finite dataset.
12pub trait AsyncFiniteDataset: TryDataset {
13	/// Asynchronous fallible quads stream.
14	type AsyncQuads<'a>: Stream<Item = Result<Quad<Self::Resource>, Self::Error>>
15	where
16		Self: 'a;
17
18	/// Returns a stream over the quads of the dataset.
19	async fn async_quads(&self) -> Result<Self::AsyncQuads<'_>, Self::Error>;
20}
21
22/// Any fallible finite dataset can be used, synchronously, as an
23/// asynchronous finite dataset.
24impl<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
35/// Async pattern-matching-capable dataset.
36pub trait AsyncPatternMatchingDataset: TryDataset {
37	/// Asynchronous fallible pattern-matching stream.
38	type AsyncQuadPatternMatching<'a, 'p>: Stream<Item = Result<Quad<Self::Resource>, Self::Error>>
39	where
40		Self: 'a,
41		Self::Resource: 'p;
42
43	/// Returns a stream over all the quads of the dataset matching the
44	/// given pattern.
45	async fn async_quad_pattern_matching<'p>(
46		&self,
47		pattern: LinearQuadPattern<&'p Self::Resource>,
48	) -> Result<Self::AsyncQuadPatternMatching<'_, 'p>, Self::Error>;
49
50	/// Checks if the dataset contains the given quad.
51	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
57/// Any fallible pattern-matching-capable dataset can be used, synchronously,
58/// as an asynchronous pattern-matching-capable dataset.
59impl<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
74/// Async mutable dataset.
75pub trait AsyncDatasetMut: TryDataset {
76	/// Inserts the given quad in the dataset.
77	async fn async_insert(&mut self, quad: Quad<Self::Resource>) -> Result<(), Self::Error>;
78}
79
80/// Any fallible mutable dataset can be used, synchronously, as an
81/// asynchronous mutable dataset.
82impl<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}