sophia_api/source/
convert.rs

1//! I define [`ToQuads`] and [`ToQuads`],
2//! the result type of [`TripleSource::to_quads`] and [`QuadSource::to_triples`] respectively.
3
4use crate::quad::{Quad, Spog};
5use crate::triple::Triple;
6
7use super::{QuadSource, TripleSource};
8
9/// The result type of [`TripleSource::to_quads`].
10pub 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
29/// The result type of [`QuadSource::to_triples`].
30pub 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}