sophia_api/source/
convert.rs1use crate::quad::{Quad, Spog};
5use crate::triple::Triple;
6
7use super::{QuadSource, Source, TripleSource};
8
9pub struct ToQuads<TS>(pub(super) TS);
11
12impl<TS: TripleSource> Source for ToQuads<TS> {
13 type Item<'x> = Spog<<TS::Triple<'x> as Triple>::Term>;
14
15 type Error = TS::Error;
16
17 fn try_for_some_item<E, F>(&mut self, mut f: F) -> super::StreamResult<bool, Self::Error, E>
18 where
19 E: std::error::Error + Send + Sync + 'static,
20 F: FnMut(Self::Item<'_>) -> Result<(), E>,
21 {
22 self.0.try_for_some_triple(|t| {
23 let quad = (t.to_spo(), None);
24 f(quad)
25 })
26 }
27
28 fn size_hint_items(&self) -> (usize, Option<usize>) {
29 self.0.size_hint_triples()
30 }
31}
32
33pub struct ToTriples<QS>(pub(super) QS);
35
36impl<QS: QuadSource> Source for ToTriples<QS> {
37 type Item<'x> = [<QS::Quad<'x> as Quad>::Term; 3];
38
39 type Error = QS::Error;
40
41 fn try_for_some_item<E, F>(&mut self, mut f: F) -> super::StreamResult<bool, Self::Error, E>
42 where
43 E: std::error::Error + Send + Sync + 'static,
44 F: FnMut(Self::Item<'_>) -> Result<(), E>,
45 {
46 self.0.try_for_some_quad(|q| {
47 let triple = q.to_spog().0;
48 f(triple)
49 })
50 }
51
52 fn size_hint_items(&self) -> (usize, Option<usize>) {
53 self.0.size_hint_quads()
54 }
55}
56
57#[cfg(test)]
58mod test {
59 use super::*;
60 use crate::dataset::{Dataset, MutableDataset};
61 use crate::graph::{Graph, MutableGraph};
62 use crate::term::ez_term;
63 use crate::term::SimpleTerm;
64
65 #[test]
66 fn ts_to_quads() {
67 let g = vec![
68 [ez_term(":a"), ez_term(":b"), ez_term(":c")],
69 [ez_term(":d"), ez_term(":e"), ez_term(":f")],
70 [ez_term(":g"), ez_term(":h"), ez_term(":i")],
71 ];
72 let mut h: Vec<Spog<SimpleTerm>> = vec![];
73 g.triples()
74 .to_quads()
75 .for_each_quad(|q| {
76 h.insert_quad(q).unwrap();
77 })
78 .unwrap();
79 assert_eq!(
80 h,
81 vec![
82 ([ez_term(":a"), ez_term(":b"), ez_term(":c")], None),
83 ([ez_term(":d"), ez_term(":e"), ez_term(":f")], None),
84 ([ez_term(":g"), ez_term(":h"), ez_term(":i")], None),
85 ]
86 )
87 }
88
89 #[test]
90 fn qs_to_triples() {
91 let d = vec![
92 ([ez_term(":a"), ez_term(":b"), ez_term(":c")], None),
93 ([ez_term(":d"), ez_term(":e"), ez_term(":f")], None),
94 ([ez_term(":g"), ez_term(":h"), ez_term(":i")], None),
95 ];
96 let mut h: Vec<[SimpleTerm; 3]> = vec![];
97 d.quads()
98 .to_triples()
99 .for_each_triple(|t| {
100 h.insert_triple(t).unwrap();
101 })
102 .unwrap();
103 assert_eq!(
104 h,
105 vec![
106 [ez_term(":a"), ez_term(":b"), ez_term(":c")],
107 [ez_term(":d"), ez_term(":e"), ez_term(":f")],
108 [ez_term(":g"), ez_term(":h"), ez_term(":i")],
109 ]
110 )
111 }
112}