1use iref::Iri;
2
3use crate::{
4 vocabulary::{BlankIdVocabulary, IriVocabulary},
5 BlankId, Generator, Id, Literal, LiteralRef, Quad, Term, Vocabulary, VocabularyMut,
6};
7
8use super::{
9 IdInterpretation, IdInterpretationMut, IdsOf, LiteralInterpretation, LiteralInterpretationMut,
10 ReverseBlankIdInterpretation, ReverseIdInterpretation, ReverseIdInterpretationMut,
11 ReverseIriInterpretation, ReverseLiteralInterpretation, TraversableInterpretation,
12 UninterpretedGrdfQuadRef, UninterpretedTermRef,
13};
14
15pub trait TermInterpretation<I, B, L = Literal>:
17 IdInterpretation<I, B> + LiteralInterpretation<L>
18{
19 fn term_interpretation(&self, term: &Term<Id<I, B>, L>) -> Option<Self::Resource> {
21 match term {
22 Term::Id(id) => self.id_interpretation(id),
23 Term::Literal(l) => self.literal_interpretation(l),
24 }
25 }
26
27 fn lexical_term_interpretation(
28 &self,
29 vocabulary: &impl Vocabulary<Iri = I, BlankId = B, Literal = L>,
30 term: Term<Id<&Iri, &BlankId>, LiteralRef<I>>,
31 ) -> Option<Self::Resource> {
32 match term {
33 Term::Id(id) => self.lexical_id_interpretation(vocabulary, id),
34 Term::Literal(l) => self.lexical_literal_interpretation(vocabulary, l),
35 }
36 }
37}
38
39impl<I, B, L, T: IdInterpretation<I, B> + LiteralInterpretation<L>> TermInterpretation<I, B, L>
40 for T
41{
42}
43
44pub trait TermInterpretationMut<I, B, L = Literal>:
45 IdInterpretationMut<I, B> + LiteralInterpretationMut<L>
46{
47 fn interpret_term(&mut self, term: Term<Id<I, B>, L>) -> Self::Resource {
48 match term {
49 Term::Id(id) => self.interpret_id(id),
50 Term::Literal(l) => self.interpret_literal(l),
51 }
52 }
53
54 fn interpret_lexical_term(
55 &mut self,
56 vocabulary: &mut impl VocabularyMut<Iri = I, BlankId = B, Literal = L>,
57 term: Term<Id<&Iri, &BlankId>, LiteralRef<I>>,
58 ) -> Self::Resource {
59 match term {
60 Term::Id(id) => self.interpret_lexical_id(vocabulary, id),
61 Term::Literal(l) => self.interpret_lexical_literal(vocabulary, l),
62 }
63 }
64
65 fn interpret_owned_lexical_term(
66 &mut self,
67 vocabulary: &mut impl VocabularyMut<Iri = I, BlankId = B, Literal = L>,
68 term: Term<Id, Literal<I>>,
69 ) -> Self::Resource {
70 match term {
71 Term::Id(id) => self.interpret_owned_lexical_id(vocabulary, id),
72 Term::Literal(l) => self.interpret_owned_lexical_literal(vocabulary, l),
73 }
74 }
75
76 fn interpret_full_lexical_term(
77 &mut self,
78 vocabulary: &mut impl VocabularyMut<Iri = I, BlankId = B, Literal = L>,
79 term: Term,
80 ) -> Self::Resource {
81 match term {
82 Term::Id(id) => self.interpret_owned_lexical_id(vocabulary, id),
83 Term::Literal(l) => self.interpret_full_lexical_literal(vocabulary, l),
84 }
85 }
86}
87
88impl<I, B, L, T: IdInterpretationMut<I, B> + LiteralInterpretationMut<L>>
89 TermInterpretationMut<I, B, L> for T
90{
91}
92
93pub type TermOf<'a, I> = Term<
94 Id<&'a <I as ReverseIriInterpretation>::Iri, &'a <I as ReverseBlankIdInterpretation>::BlankId>,
95 &'a <I as ReverseLiteralInterpretation>::Literal,
96>;
97
98pub trait ReverseTermInterpretation:
99 ReverseIdInterpretation + ReverseLiteralInterpretation
100{
101 fn terms_of<'a>(&'a self, id: &'a Self::Resource) -> TermsOf<'a, Self> {
102 TermsOf {
103 ids: self.ids_of(id),
104 literals: self.literals_of(id),
105 }
106 }
107
108 fn term_of<'a>(&'a self, id: &'a Self::Resource) -> Option<TermOf<'a, Self>> {
109 self.terms_of(id).next()
110 }
111
112 fn has_term(&self, id: &Self::Resource) -> bool {
113 self.term_of(id).is_some()
114 }
115
116 fn quads_of<'a>(
117 &'a self,
118 quad: Quad<&'a Self::Resource, &'a Self::Resource, &'a Self::Resource, &'a Self::Resource>,
119 ) -> QuadsOf<'a, Self> {
120 QuadsOf {
121 s: self.ids_of(quad.0),
122 p: self.iris_of(quad.1),
123 o: self.terms_of(quad.2),
124 g: quad.3.map(|g| self.ids_of(g)),
125 pogs: None,
126 }
127 }
128
129 fn grdf_quads_of<'a>(
130 &'a self,
131 quad: Quad<&'a Self::Resource, &'a Self::Resource, &'a Self::Resource, &'a Self::Resource>,
132 ) -> GrdfQuadsOf<'a, Self> {
133 GrdfQuadsOf {
134 s: self.terms_of(quad.0),
135 p: self.terms_of(quad.1),
136 o: self.terms_of(quad.2),
137 g: quad.3.map(|g| self.terms_of(g)),
138 pogs: None,
139 }
140 }
141}
142
143pub struct QuadsOf<'a, I: ?Sized + ReverseTermInterpretation> {
144 s: IdsOf<'a, I>,
145 p: I::Iris<'a>,
146 o: TermsOf<'a, I>,
147 g: Option<IdsOf<'a, I>>,
148 pogs: Option<PogsOf<'a, I>>,
149}
150
151impl<'a, I: ?Sized + ReverseTermInterpretation> Iterator for QuadsOf<'a, I> {
152 type Item = Quad<
153 Id<&'a I::Iri, &'a I::BlankId>,
154 &'a I::Iri,
155 Term<Id<&'a I::Iri, &'a I::BlankId>, &'a I::Literal>,
156 Id<&'a I::Iri, &'a I::BlankId>,
157 >;
158
159 fn next(&mut self) -> Option<Self::Item> {
160 loop {
161 match self.pogs.as_mut() {
162 Some(pogs) => match pogs.next() {
163 Some(quad) => break Some(quad),
164 None => self.pogs = None,
165 },
166 None => match self.s.next() {
167 Some(s) => {
168 self.pogs = Some(PogsOf {
169 s,
170 p: self.p.clone(),
171 o: self.o.clone(),
172 g: self.g.clone(),
173 ogs: None,
174 })
175 }
176 None => break None,
177 },
178 }
179 }
180 }
181}
182
183struct PogsOf<'a, I: ?Sized + ReverseTermInterpretation> {
184 s: Id<&'a I::Iri, &'a I::BlankId>,
185 p: I::Iris<'a>,
186 o: TermsOf<'a, I>,
187 g: Option<IdsOf<'a, I>>,
188 ogs: Option<OgsOf<'a, I>>,
189}
190
191impl<'a, I: ?Sized + ReverseTermInterpretation> Iterator for PogsOf<'a, I> {
192 type Item = Quad<
193 Id<&'a I::Iri, &'a I::BlankId>,
194 &'a I::Iri,
195 Term<Id<&'a I::Iri, &'a I::BlankId>, &'a I::Literal>,
196 Id<&'a I::Iri, &'a I::BlankId>,
197 >;
198
199 fn next(&mut self) -> Option<Self::Item> {
200 loop {
201 match self.ogs.as_mut() {
202 Some(ogs) => match ogs.next() {
203 Some(quad) => break Some(quad),
204 None => self.ogs = None,
205 },
206 None => match self.p.next() {
207 Some(p) => {
208 self.ogs = Some(OgsOf {
209 s: self.s,
210 p,
211 o: self.o.clone(),
212 g: self.g.clone(),
213 gs: None,
214 })
215 }
216 None => break None,
217 },
218 }
219 }
220 }
221}
222
223struct OgsOf<'a, I: ?Sized + ReverseTermInterpretation> {
224 s: Id<&'a I::Iri, &'a I::BlankId>,
225 p: &'a I::Iri,
226 o: TermsOf<'a, I>,
227 g: Option<IdsOf<'a, I>>,
228 gs: Option<GsOf<'a, I>>,
229}
230
231impl<'a, I: ?Sized + ReverseTermInterpretation> Iterator for OgsOf<'a, I> {
232 type Item = Quad<
233 Id<&'a I::Iri, &'a I::BlankId>,
234 &'a I::Iri,
235 Term<Id<&'a I::Iri, &'a I::BlankId>, &'a I::Literal>,
236 Id<&'a I::Iri, &'a I::BlankId>,
237 >;
238
239 fn next(&mut self) -> Option<Self::Item> {
240 loop {
241 match self.gs.as_mut() {
242 Some(gs) => match gs.next() {
243 Some(quad) => break Some(quad),
244 None => self.gs = None,
245 },
246 None => match self.o.next() {
247 Some(o) => match self.g.clone() {
248 Some(g) => {
249 self.gs = Some(GsOf {
250 s: self.s,
251 p: self.p,
252 o,
253 g,
254 })
255 }
256 None => break Some(Quad(self.s, self.p, o, None)),
257 },
258 None => break None,
259 },
260 }
261 }
262 }
263}
264
265struct GsOf<'a, I: ?Sized + ReverseTermInterpretation> {
266 s: Id<&'a I::Iri, &'a I::BlankId>,
267 p: &'a I::Iri,
268 o: Term<Id<&'a I::Iri, &'a I::BlankId>, &'a I::Literal>,
269 g: IdsOf<'a, I>,
270}
271
272impl<'a, I: ?Sized + ReverseTermInterpretation> Iterator for GsOf<'a, I> {
273 type Item = Quad<
274 Id<&'a I::Iri, &'a I::BlankId>,
275 &'a I::Iri,
276 Term<Id<&'a I::Iri, &'a I::BlankId>, &'a I::Literal>,
277 Id<&'a I::Iri, &'a I::BlankId>,
278 >;
279
280 fn next(&mut self) -> Option<Self::Item> {
281 self.g.next().map(|g| Quad(self.s, self.p, self.o, Some(g)))
282 }
283}
284
285pub struct GrdfQuadsOf<'a, I: ?Sized + ReverseTermInterpretation> {
286 s: TermsOf<'a, I>,
287 p: TermsOf<'a, I>,
288 o: TermsOf<'a, I>,
289 g: Option<TermsOf<'a, I>>,
290 pogs: Option<GrdfPogsOf<'a, I>>,
291}
292
293impl<'a, I: ?Sized + ReverseTermInterpretation> Iterator for GrdfQuadsOf<'a, I> {
294 type Item = UninterpretedGrdfQuadRef<'a, I>;
295
296 fn next(&mut self) -> Option<Self::Item> {
297 loop {
298 match self.pogs.as_mut() {
299 Some(pogs) => match pogs.next() {
300 Some(quad) => break Some(quad),
301 None => self.pogs = None,
302 },
303 None => match self.s.next() {
304 Some(s) => {
305 self.pogs = Some(GrdfPogsOf {
306 s,
307 p: self.p.clone(),
308 o: self.o.clone(),
309 g: self.g.clone(),
310 ogs: None,
311 })
312 }
313 None => break None,
314 },
315 }
316 }
317 }
318}
319
320struct GrdfPogsOf<'a, I: ?Sized + ReverseTermInterpretation> {
321 s: UninterpretedTermRef<'a, I>,
322 p: TermsOf<'a, I>,
323 o: TermsOf<'a, I>,
324 g: Option<TermsOf<'a, I>>,
325 ogs: Option<GrdfOgsOf<'a, I>>,
326}
327
328impl<'a, I: ?Sized + ReverseTermInterpretation> Iterator for GrdfPogsOf<'a, I> {
329 type Item = UninterpretedGrdfQuadRef<'a, I>;
330
331 fn next(&mut self) -> Option<Self::Item> {
332 loop {
333 match self.ogs.as_mut() {
334 Some(ogs) => match ogs.next() {
335 Some(quad) => break Some(quad),
336 None => self.ogs = None,
337 },
338 None => match self.p.next() {
339 Some(p) => {
340 self.ogs = Some(GrdfOgsOf {
341 s: self.s,
342 p,
343 o: self.o.clone(),
344 g: self.g.clone(),
345 gs: None,
346 })
347 }
348 None => break None,
349 },
350 }
351 }
352 }
353}
354
355struct GrdfOgsOf<'a, I: ?Sized + ReverseTermInterpretation> {
356 s: UninterpretedTermRef<'a, I>,
357 p: UninterpretedTermRef<'a, I>,
358 o: TermsOf<'a, I>,
359 g: Option<TermsOf<'a, I>>,
360 gs: Option<GrdfGsOf<'a, I>>,
361}
362
363impl<'a, I: ?Sized + ReverseTermInterpretation> Iterator for GrdfOgsOf<'a, I> {
364 type Item = UninterpretedGrdfQuadRef<'a, I>;
365
366 fn next(&mut self) -> Option<Self::Item> {
367 loop {
368 match self.gs.as_mut() {
369 Some(gs) => match gs.next() {
370 Some(quad) => break Some(quad),
371 None => self.gs = None,
372 },
373 None => match self.o.next() {
374 Some(o) => match self.g.clone() {
375 Some(g) => {
376 self.gs = Some(GrdfGsOf {
377 s: self.s,
378 p: self.p,
379 o,
380 g,
381 })
382 }
383 None => break Some(Quad(self.s, self.p, o, None)),
384 },
385 None => break None,
386 },
387 }
388 }
389 }
390}
391
392struct GrdfGsOf<'a, I: ?Sized + ReverseTermInterpretation> {
393 s: UninterpretedTermRef<'a, I>,
394 p: UninterpretedTermRef<'a, I>,
395 o: UninterpretedTermRef<'a, I>,
396 g: TermsOf<'a, I>,
397}
398
399impl<'a, I: ?Sized + ReverseTermInterpretation> Iterator for GrdfGsOf<'a, I> {
400 type Item = UninterpretedGrdfQuadRef<'a, I>;
401
402 fn next(&mut self) -> Option<Self::Item> {
403 self.g.next().map(|g| Quad(self.s, self.p, self.o, Some(g)))
404 }
405}
406
407impl<I: ?Sized + ReverseIdInterpretation + ReverseLiteralInterpretation> ReverseTermInterpretation
408 for I
409{
410}
411
412pub trait ReverseLiteralInterpretationMut: ReverseLiteralInterpretation {
413 fn assign_literal(&mut self, resource: &Self::Resource, literal: Self::Literal) -> bool;
415}
416
417pub trait ReverseTermInterpretationMut:
421 ReverseIdInterpretationMut + ReverseLiteralInterpretationMut
422{
423 fn assign_term(
425 &mut self,
426 resource: &Self::Resource,
427 term: Term<Id<Self::Iri, Self::BlankId>, Self::Literal>,
428 ) -> bool {
429 match term {
430 Term::Id(id) => self.assign_id(resource, id),
431 Term::Literal(l) => self.assign_literal(resource, l),
432 }
433 }
434
435 fn assign_terms(
437 &mut self,
438 mut f: impl FnMut(
439 &Self,
440 &Self::Resource,
441 ) -> Option<Term<Id<Self::Iri, Self::BlankId>, Self::Literal>>,
442 ) where
443 Self::Resource: Clone,
444 Self: TraversableInterpretation,
445 {
446 let mut terms = Vec::new();
447 for r in self.resources() {
448 if let Some(term) = f(self, r) {
449 terms.push((r.clone(), term))
450 }
451 }
452
453 for (r, term) in terms {
454 self.assign_term(&r, term);
455 }
456 }
457
458 fn generate_ids<V: IriVocabulary + BlankIdVocabulary>(
461 &mut self,
462 vocabulary: &mut V,
463 generator: &mut impl Generator<V>,
464 ) where
465 Self::Resource: Clone,
466 Self: TraversableInterpretation
467 + ReverseTermInterpretationMut<Iri = V::Iri, BlankId = V::BlankId>,
468 {
469 self.assign_terms(|i, r| (!i.has_term(r)).then(|| Term::Id(generator.next(vocabulary))))
470 }
471}
472
473impl<I: ReverseIdInterpretationMut + ReverseLiteralInterpretationMut> ReverseTermInterpretationMut
474 for I
475{
476}
477
478pub struct TermsOf<'a, I: 'a + ?Sized + ReverseTermInterpretation> {
480 ids: IdsOf<'a, I>,
481 literals: I::Literals<'a>,
482}
483
484impl<'a, I: 'a + ?Sized + ReverseTermInterpretation> Clone for TermsOf<'a, I> {
485 fn clone(&self) -> Self {
486 Self {
487 ids: self.ids.clone(),
488 literals: self.literals.clone(),
489 }
490 }
491}
492
493impl<'a, I: 'a + ?Sized + ReverseTermInterpretation> Copy for TermsOf<'a, I>
494where
495 I::Iris<'a>: Copy,
496 I::BlankIds<'a>: Copy,
497 I::Literals<'a>: Copy,
498{
499}
500
501impl<'a, I: 'a + ?Sized + ReverseTermInterpretation> Iterator for TermsOf<'a, I> {
502 type Item = UninterpretedTermRef<'a, I>;
503
504 fn next(&mut self) -> Option<Self::Item> {
505 self.ids
506 .next()
507 .map(Term::Id)
508 .or_else(|| self.literals.next().map(Term::Literal))
509 }
510}