use crate::id::Id;
use super::Fragment;
use super::TribleSet;
pub trait Spread {
type Item;
type Iter: IntoIterator<Item = Self::Item>;
fn spread(self) -> (Self::Iter, TribleSet);
}
impl<I: IntoIterator> Spread for I {
type Item = I::Item;
type Iter = I;
fn spread(self) -> (Self::Iter, TribleSet) {
(self, TribleSet::new())
}
}
impl Spread for Fragment {
type Item = Id;
type Iter = std::vec::IntoIter<Id>;
fn spread(self) -> (Self::Iter, TribleSet) {
let (exports, facts) = self.into_parts();
let ids: Vec<Id> = exports
.iter_ordered()
.map(|raw| Id::new(*raw).expect("export ids are non-nil"))
.collect();
(ids.into_iter(), facts)
}
}