use std::collections::BTreeMap;
#[derive(Debug, Default, Clone)]
pub struct OrderedMap<K: Ord, V> {
inner: BTreeMap<K, V>,
}
impl<K: Ord, V> OrderedMap<K, V> {
pub fn new() -> Self {
Self {
inner: BTreeMap::new(),
}
}
pub fn insert(&mut self, key: K, value: V) -> Option<V> {
self.inner.insert(key, value)
}
pub fn remove(&mut self, key: &K) -> Option<V> {
self.inner.remove(key)
}
pub fn get(&self, key: &K) -> Option<&V> {
self.inner.get(key)
}
pub fn len(&self) -> usize {
self.inner.len()
}
pub fn is_empty(&self) -> bool {
self.inner.is_empty()
}
pub fn clear(&mut self) {
self.inner.clear();
}
pub fn min(&self) -> Option<(&K, &V)> {
self.inner.iter().next()
}
pub fn max(&self) -> Option<(&K, &V)> {
self.inner.iter().next_back()
}
pub fn lower_bound(&self, probe: &K) -> Option<(&K, &V)> {
self.inner.range(probe..).next()
}
pub fn iter(&self) -> impl Iterator<Item = (&K, &V)> {
self.inner.iter()
}
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn ordered_iteration() {
let mut t: OrderedMap<u32, u32> = OrderedMap::new();
for k in [3, 1, 5, 2, 4] {
t.insert(k, k * 10);
}
let keys: Vec<u32> = t.iter().map(|(k, _)| *k).collect();
assert_eq!(keys, vec![1, 2, 3, 4, 5]);
}
#[test]
fn min_and_max() {
let mut t: OrderedMap<u32, u32> = OrderedMap::new();
assert!(t.min().is_none());
t.insert(7, 0);
t.insert(3, 0);
t.insert(11, 0);
assert_eq!(t.min().map(|(k, _)| *k), Some(3));
assert_eq!(t.max().map(|(k, _)| *k), Some(11));
}
#[test]
fn lower_bound_wraps_at_end() {
let mut t: OrderedMap<u32, u32> = OrderedMap::new();
t.insert(10, 1);
t.insert(20, 2);
t.insert(30, 3);
assert_eq!(t.lower_bound(&0).map(|(k, _)| *k), Some(10));
assert_eq!(t.lower_bound(&15).map(|(k, _)| *k), Some(20));
assert_eq!(t.lower_bound(&30).map(|(k, _)| *k), Some(30));
assert!(t.lower_bound(&31).is_none());
}
}