use crate::id::Id;
use crate::id::RawId;
use crate::patch::{IdentitySchema, PATCHIntoOrderedIterator};
use super::Fragment;
pub trait Spread {
type Item;
type Iter: IntoIterator<Item = Self::Item>;
fn spread(self) -> (Self::Iter, Fragment);
}
impl<I: IntoIterator> Spread for I {
type Item = I::Item;
type Iter = I;
fn spread(self) -> (Self::Iter, Fragment) {
(self, Fragment::empty())
}
}
fn raw_to_id(raw: RawId) -> Id {
Id::new(raw).expect("export ids are non-nil")
}
impl Spread for Fragment {
type Item = Id;
type Iter = std::iter::Map<
PATCHIntoOrderedIterator<16, IdentitySchema, ()>,
fn(RawId) -> Id,
>;
fn spread(self) -> (Self::Iter, Fragment) {
let (exports, facts, blobs) = self.into_parts();
let extras = Fragment::from_facts_and_blobs(facts, blobs);
let iter = exports.into_iter_ordered().map(raw_to_id as fn(_) -> _);
(iter, extras)
}
}