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, Source, TripleSource};
8
9/// The result type of [`TripleSource::to_quads`].
10pub 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
33/// The result type of [`QuadSource::to_triples`].
34pub 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}