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