use std::collections::BTreeSet;
use crate::filter::KeepEvents;
use crate::model::Ocel;
impl Ocel {
#[must_use]
pub fn sample_components(&self, n: usize) -> Ocel {
let components = self.object_graph().connected_components();
self.keep_components(components.iter().take(n))
}
#[must_use]
pub fn filter_components<F>(&self, pred: F) -> Ocel
where
F: Fn(&[&str]) -> bool,
{
let components = self.object_graph().connected_components();
self.keep_components(components.iter().filter(|c| pred(c)))
}
fn keep_components<'a, I>(&self, chosen: I) -> Ocel
where
I: Iterator<Item = &'a Vec<&'a str>>,
{
let kept: BTreeSet<&str> = chosen.flatten().copied().collect();
self.subset(
|_| true,
|id| kept.contains(id),
KeepEvents::RelatedToKeptObjects,
)
}
}