use core_storage::fs::Fs;
use std::collections::HashSet;
use crate::db::GraphDb;
#[derive(Clone, Copy, PartialEq, Eq, Debug, Default)]
pub enum MaskMode {
#[default]
Omit,
Stub,
}
#[derive(Clone, Debug)]
pub struct NodeMask {
pub(crate) visible: HashSet<u32>,
mode: MaskMode,
}
impl NodeMask {
pub fn from_keys<'a, F: Fs>(db: &GraphDb<F>, keys: impl IntoIterator<Item = &'a str>) -> Self {
let visible = keys.into_iter().filter_map(|k| db.ids().get(k)).collect();
NodeMask {
visible,
mode: MaskMode::default(),
}
}
pub fn from_ids(ids: impl IntoIterator<Item = u32>) -> Self {
NodeMask {
visible: ids.into_iter().collect(),
mode: MaskMode::default(),
}
}
pub fn with_mode(self, mode: MaskMode) -> Self {
NodeMask { mode, ..self }
}
pub fn mode(&self) -> MaskMode {
self.mode
}
pub fn len(&self) -> usize {
self.visible.len()
}
pub fn is_empty(&self) -> bool {
self.visible.is_empty()
}
pub fn intersect(&self, other: &NodeMask) -> NodeMask {
NodeMask {
visible: self.visible.intersection(&other.visible).copied().collect(),
mode: MaskMode::Omit,
}
}
pub fn contains_id(&self, id: u32) -> bool {
self.visible.contains(&id)
}
pub fn contains_node<F: core_storage::fs::Fs>(
&self,
db: &crate::db::GraphDb<F>,
key: &str,
) -> bool {
db.ids()
.get(key)
.is_some_and(|id| self.visible.contains(&id))
}
}