triblespace_core/trible/
spread.rs1use crate::id::Id;
2
3use super::Fragment;
4use super::TribleSet;
5
6pub trait Spread {
14 type Item;
16 type Iter: IntoIterator<Item = Self::Item>;
18 fn spread(self) -> (Self::Iter, TribleSet);
20}
21
22impl<I: IntoIterator> Spread for I {
23 type Item = I::Item;
24 type Iter = I;
25 fn spread(self) -> (Self::Iter, TribleSet) {
26 (self, TribleSet::new())
27 }
28}
29
30impl Spread for Fragment {
31 type Item = Id;
32 type Iter = std::vec::IntoIter<Id>;
33 fn spread(self) -> (Self::Iter, TribleSet) {
34 let (exports, facts) = self.into_parts();
35 let ids: Vec<Id> = exports
36 .iter_ordered()
37 .map(|raw| Id::new(*raw).expect("export ids are non-nil"))
38 .collect();
39 (ids.into_iter(), facts)
40 }
41}