use std::sync::Arc;
use indexmap::IndexMap;
use crate::{column::flags::ColumnFlag, traits::column_like::ColumnLike};
pub trait ColumnCollectionExt {
fn only(&self, flag: ColumnFlag) -> Arc<IndexMap<String, Arc<dyn ColumnLike>>>;
fn exclude(&self, flag: ColumnFlag) -> Arc<IndexMap<String, Arc<dyn ColumnLike>>>;
}
impl ColumnCollectionExt for Arc<IndexMap<String, Arc<dyn ColumnLike>>> {
fn only(&self, flag: ColumnFlag) -> Arc<IndexMap<String, Arc<dyn ColumnLike>>> {
let filtered: IndexMap<String, Arc<dyn ColumnLike>> = self
.iter()
.filter(|(_, col)| col.flags().contains(&flag))
.map(|(k, v)| (k.clone(), v.clone()))
.collect();
Arc::new(filtered)
}
fn exclude(&self, flag: ColumnFlag) -> Arc<IndexMap<String, Arc<dyn ColumnLike>>> {
let filtered: IndexMap<String, Arc<dyn ColumnLike>> = self
.iter()
.filter(|(_, col)| !col.flags().contains(&flag))
.map(|(k, v)| (k.clone(), v.clone()))
.collect();
Arc::new(filtered)
}
}