use std::collections::BTreeMap;
use std::collections::btree_map::{Iter, Keys, Values};
use crate::formats::TmuxText;
#[derive(Clone, Debug, Default, Eq, PartialEq)]
pub struct SparseValues<T> {
entries: BTreeMap<u32, T>,
}
pub type IndexedHooks = SparseValues<TmuxText>;
impl<T> SparseValues<T> {
pub(crate) fn from_entries(entries: BTreeMap<u32, T>) -> Self {
Self { entries }
}
#[must_use]
pub fn get(&self, index: u32) -> Option<&T> {
self.entries.get(&index)
}
#[must_use]
pub fn first(&self) -> Option<&T> {
self.entries.values().next()
}
#[must_use]
pub fn len(&self) -> usize {
self.entries.len()
}
#[must_use]
pub fn is_empty(&self) -> bool {
self.entries.is_empty()
}
pub fn iter(&self) -> Iter<'_, u32, T> {
self.entries.iter()
}
pub fn indices(&self) -> Keys<'_, u32, T> {
self.entries.keys()
}
pub fn values(&self) -> Values<'_, u32, T> {
self.entries.values()
}
#[must_use]
pub fn into_values(self) -> Vec<T> {
self.entries.into_values().collect()
}
}
impl<T> From<BTreeMap<u32, T>> for SparseValues<T> {
fn from(entries: BTreeMap<u32, T>) -> Self {
Self::from_entries(entries)
}
}
impl<'values, T> IntoIterator for &'values SparseValues<T> {
type Item = (&'values u32, &'values T);
type IntoIter = Iter<'values, u32, T>;
fn into_iter(self) -> Self::IntoIter {
self.iter()
}
}
#[derive(Clone, Copy, Debug, Eq, PartialEq)]
pub enum ReplaceMode {
Replace,
Merge,
}