use std::mem;
pub trait Set<T> {
fn set_insert(&mut self, t: T) -> bool;
}
impl<T: Ord> Set<T> for Vec<T> {
fn set_insert(&mut self, val: T) -> bool {
self.binary_search(&val)
.map_err(|i| self.insert(i, val))
.is_err()
}
}
pub trait Map<K, V> {
fn map_insert(&mut self, key: K, val: V) -> Option<V>;
fn map_remove(&mut self, key: &K) -> Option<(K, V)>;
fn map_lookup(&self, key: &K) -> Option<&V>;
fn find_gte(&self, key: &K) -> Option<&V>;
}
#[inline]
pub(crate) fn first<L, R>(tup: &(L, R)) -> &L {
&tup.0
}
#[inline]
pub(crate) fn second<L, R>(tup: &(L, R)) -> &R {
&tup.1
}
impl<K: Ord, V> Map<K, V> for Vec<(K, V)> {
fn map_insert(&mut self, key: K, val: V) -> Option<V> {
match self.binary_search_by_key(&&key, first) {
Err(i) => Err(self.insert(i, (key, val))),
Ok(i) => Ok(mem::replace(
&mut unsafe { self.get_unchecked_mut(i) }.1,
val,
)),
}
.ok()
}
fn map_remove(&mut self, key: &K) -> Option<(K, V)> {
self.binary_search_by_key(&key, first)
.map(|i| self.remove(i))
.ok()
}
fn map_lookup(&self, key: &K) -> Option<&V> {
self.binary_search_by_key(&key, first)
.map(|i| unsafe { self.get_unchecked(i) })
.map(second)
.ok()
}
fn find_gte(&self, key: &K) -> Option<&V> {
let checked = |i| match self.len() {
n if n == 0 => None,
n if n == i => Some(0),
_ => Some(i),
};
self.binary_search_by_key(&key, first)
.map_or_else(checked, Some)
.map(|i| unsafe { self.get_unchecked(i) })
.map(second)
}
}