use super::functions::*;
use std::collections::{HashMap, HashSet, VecDeque};
#[derive(Debug, Clone)]
enum PersistentNode<K, V> {
Leaf,
Node(K, V, Box<PersistentNode<K, V>>, Box<PersistentNode<K, V>>),
}
#[derive(Debug, Clone)]
pub struct IntervalMap<T: Ord + Clone, V: Clone> {
pub(super) intervals: Vec<IntervalEntry<T, V>>,
}
impl<T: Ord + Clone, V: Clone> IntervalMap<T, V> {
pub fn new() -> Self {
Self::default()
}
pub fn insert(&mut self, lo: T, hi: T, value: V) {
self.intervals.push(IntervalEntry { lo, hi, value });
}
pub fn query(&self, point: &T) -> Vec<&V> {
self.intervals
.iter()
.filter(|e| &e.lo <= point && point <= &e.hi)
.map(|e| &e.value)
.collect()
}
pub fn len(&self) -> usize {
self.intervals.len()
}
pub fn is_empty(&self) -> bool {
self.intervals.is_empty()
}
pub fn clear(&mut self) {
self.intervals.clear();
}
}
#[allow(dead_code)]
pub struct LRUCacheHm<K, V> {
pub capacity: usize,
pub store: std::collections::HashMap<K, V>,
pub order: std::collections::VecDeque<K>,
}
#[derive(Debug, Clone)]
pub struct MultiMap<K: PartialEq + Clone, V: Clone> {
inner: AssocMap<K, Vec<V>>,
}
impl<K: PartialEq + Clone, V: Clone> MultiMap<K, V> {
pub fn new() -> Self {
Self {
inner: AssocMap::new(),
}
}
pub fn insert(&mut self, key: K, value: V) {
if let Some(vals) = self.inner.get_mut(&key) {
vals.push(value);
} else {
self.inner.insert(key, vec![value]);
}
}
pub fn get(&self, key: &K) -> &[V] {
self.inner.get(key).map(|v| v.as_slice()).unwrap_or(&[])
}
pub fn remove(&mut self, key: &K) -> Vec<V> {
self.inner.remove(key).unwrap_or_default()
}
pub fn contains_key(&self, key: &K) -> bool {
self.inner.contains_key(key)
}
pub fn total_count(&self) -> usize {
self.inner.values().map(|v| v.len()).sum()
}
pub fn key_count(&self) -> usize {
self.inner.len()
}
pub fn is_empty(&self) -> bool {
self.inner.is_empty()
}
pub fn clear(&mut self) {
self.inner.clear();
}
}
#[derive(Debug, Clone, PartialEq)]
pub struct AssocMap<K, V> {
entries: Vec<(K, V)>,
}
impl<K: PartialEq + Clone, V: Clone> AssocMap<K, V> {
pub fn new() -> Self {
Self {
entries: Vec::new(),
}
}
pub fn insert(&mut self, key: K, value: V) {
if let Some(entry) = self.entries.iter_mut().find(|(k, _)| k == &key) {
entry.1 = value;
} else {
self.entries.push((key, value));
}
}
pub fn get(&self, key: &K) -> Option<&V> {
self.entries.iter().find(|(k, _)| k == key).map(|(_, v)| v)
}
pub fn get_mut(&mut self, key: &K) -> Option<&mut V> {
self.entries
.iter_mut()
.find(|(k, _)| k == key)
.map(|(_, v)| v)
}
pub fn remove(&mut self, key: &K) -> Option<V> {
if let Some(pos) = self.entries.iter().position(|(k, _)| k == key) {
Some(self.entries.remove(pos).1)
} else {
None
}
}
pub fn contains_key(&self, key: &K) -> bool {
self.entries.iter().any(|(k, _)| k == key)
}
pub fn len(&self) -> usize {
self.entries.len()
}
pub fn is_empty(&self) -> bool {
self.entries.is_empty()
}
pub fn iter(&self) -> impl Iterator<Item = &(K, V)> {
self.entries.iter()
}
pub fn keys(&self) -> impl Iterator<Item = &K> {
self.entries.iter().map(|(k, _)| k)
}
pub fn values(&self) -> impl Iterator<Item = &V> {
self.entries.iter().map(|(_, v)| v)
}
pub fn clear(&mut self) {
self.entries.clear();
}
pub fn into_vec(self) -> Vec<(K, V)> {
self.entries
}
pub fn merge(&mut self, other: &AssocMap<K, V>) {
for (k, v) in &other.entries {
self.insert(k.clone(), v.clone());
}
}
pub fn retain<F>(&mut self, mut f: F)
where
F: FnMut(&K, &V) -> bool,
{
self.entries.retain(|(k, v)| f(k, v));
}
}
#[allow(dead_code)]
pub struct MultiMapHm<K, V> {
pub inner: std::collections::HashMap<K, Vec<V>>,
}
#[derive(Debug, Clone)]
pub struct IntervalEntry<T: Ord, V> {
pub lo: T,
pub hi: T,
pub value: V,
}
#[allow(dead_code)]
pub struct FrozenHashMap<K, V> {
pub inner: std::collections::HashMap<K, V>,
pub frozen: bool,
}
#[derive(Debug, Clone, PartialEq)]
pub struct BiMap<K: PartialEq + Clone, V: PartialEq + Clone> {
forward: AssocMap<K, V>,
backward: AssocMap<V, K>,
}
impl<K: PartialEq + Clone, V: PartialEq + Clone> BiMap<K, V> {
pub fn new() -> Self {
Self {
forward: AssocMap::new(),
backward: AssocMap::new(),
}
}
pub fn insert(&mut self, key: K, value: V) {
if let Some(old_val) = self.forward.remove(&key) {
self.backward.remove(&old_val);
}
if let Some(old_key) = self.backward.remove(&value) {
self.forward.remove(&old_key);
}
self.forward.insert(key.clone(), value.clone());
self.backward.insert(value, key);
}
pub fn get_by_key(&self, key: &K) -> Option<&V> {
self.forward.get(key)
}
pub fn get_by_val(&self, val: &V) -> Option<&K> {
self.backward.get(val)
}
pub fn remove_by_key(&mut self, key: &K) -> Option<V> {
if let Some(val) = self.forward.remove(key) {
self.backward.remove(&val);
Some(val)
} else {
None
}
}
pub fn remove_by_val(&mut self, val: &V) -> Option<K> {
if let Some(key) = self.backward.remove(val) {
self.forward.remove(&key);
Some(key)
} else {
None
}
}
pub fn len(&self) -> usize {
self.forward.len()
}
pub fn is_empty(&self) -> bool {
self.forward.is_empty()
}
pub fn contains_key(&self, key: &K) -> bool {
self.forward.contains_key(key)
}
pub fn contains_val(&self, val: &V) -> bool {
self.backward.contains_key(val)
}
pub fn iter(&self) -> impl Iterator<Item = &(K, V)> {
self.forward.iter()
}
pub fn clear(&mut self) {
self.forward.clear();
self.backward.clear();
}
}
#[derive(Debug, Clone)]
pub struct LruMap<K: PartialEq + Clone, V: Clone> {
capacity: usize,
entries: Vec<(K, V)>,
}
impl<K: PartialEq + Clone, V: Clone> LruMap<K, V> {
pub fn new(capacity: usize) -> Self {
assert!(capacity > 0, "LruMap capacity must be positive");
Self {
capacity,
entries: Vec::with_capacity(capacity),
}
}
pub fn get(&mut self, key: &K) -> Option<&V> {
let pos = self.entries.iter().position(|(k, _)| k == key)?;
let entry = self.entries.remove(pos);
self.entries.insert(0, entry);
self.entries.first().map(|(_, v)| v)
}
pub fn insert(&mut self, key: K, value: V) {
if let Some(pos) = self.entries.iter().position(|(k, _)| k == &key) {
self.entries.remove(pos);
}
if self.entries.len() >= self.capacity {
self.entries.pop();
}
self.entries.insert(0, (key, value));
}
pub fn peek(&self, key: &K) -> Option<&V> {
self.entries.iter().find(|(k, _)| k == key).map(|(_, v)| v)
}
pub fn len(&self) -> usize {
self.entries.len()
}
pub fn is_empty(&self) -> bool {
self.entries.is_empty()
}
pub fn clear(&mut self) {
self.entries.clear();
}
pub fn capacity(&self) -> usize {
self.capacity
}
pub fn iter_mru(&self) -> impl Iterator<Item = &(K, V)> {
self.entries.iter()
}
}
#[allow(dead_code)]
pub struct HashMapMonoid<K, V> {
pub inner: std::collections::HashMap<K, V>,
}
#[derive(Debug, Clone)]
pub struct PersistentMap<K: Ord + Clone, V: Clone> {
root: PersistentNode<K, V>,
size: usize,
}
impl<K: Ord + Clone, V: Clone> PersistentMap<K, V> {
pub fn empty() -> Self {
Self {
root: PersistentNode::Leaf,
size: 0,
}
}
pub fn get(&self, key: &K) -> Option<&V> {
Self::get_node(&self.root, key)
}
fn get_node<'a>(node: &'a PersistentNode<K, V>, key: &K) -> Option<&'a V> {
match node {
PersistentNode::Leaf => None,
PersistentNode::Node(k, v, left, right) => {
use std::cmp::Ordering;
match key.cmp(k) {
Ordering::Equal => Some(v),
Ordering::Less => Self::get_node(left, key),
Ordering::Greater => Self::get_node(right, key),
}
}
}
}
pub fn insert(&self, key: K, value: V) -> Self {
let (new_root, added) = Self::insert_node(&self.root, key, value);
Self {
root: new_root,
size: if added { self.size + 1 } else { self.size },
}
}
fn insert_node(node: &PersistentNode<K, V>, key: K, value: V) -> (PersistentNode<K, V>, bool) {
match node {
PersistentNode::Leaf => (
PersistentNode::Node(
key,
value,
Box::new(PersistentNode::Leaf),
Box::new(PersistentNode::Leaf),
),
true,
),
PersistentNode::Node(k, v, left, right) => {
use std::cmp::Ordering;
match key.cmp(k) {
Ordering::Equal => (
PersistentNode::Node(k.clone(), value, left.clone(), right.clone()),
false,
),
Ordering::Less => {
let (new_left, added) = Self::insert_node(left, key, value);
(
PersistentNode::Node(
k.clone(),
v.clone(),
Box::new(new_left),
right.clone(),
),
added,
)
}
Ordering::Greater => {
let (new_right, added) = Self::insert_node(right, key, value);
(
PersistentNode::Node(
k.clone(),
v.clone(),
left.clone(),
Box::new(new_right),
),
added,
)
}
}
}
}
}
pub fn contains_key(&self, key: &K) -> bool {
self.get(key).is_some()
}
pub fn len(&self) -> usize {
self.size
}
pub fn is_empty(&self) -> bool {
self.size == 0
}
pub fn to_sorted_vec(&self) -> Vec<(K, V)> {
let mut result = Vec::new();
Self::collect_inorder(&self.root, &mut result);
result
}
fn collect_inorder(node: &PersistentNode<K, V>, out: &mut Vec<(K, V)>) {
if let PersistentNode::Node(k, v, left, right) = node {
Self::collect_inorder(left, out);
out.push((k.clone(), v.clone()));
Self::collect_inorder(right, out);
}
}
}
#[derive(Debug, Clone)]
pub struct StackMap<K: PartialEq + Clone, V: Clone> {
scopes: Vec<Vec<(K, V)>>,
}
impl<K: PartialEq + Clone, V: Clone> StackMap<K, V> {
pub fn new() -> Self {
Self {
scopes: vec![Vec::new()],
}
}
pub fn push_scope(&mut self) {
self.scopes.push(Vec::new());
}
pub fn pop_scope(&mut self) {
if self.scopes.len() > 1 {
self.scopes.pop();
}
}
pub fn insert(&mut self, key: K, value: V) {
if let Some(scope) = self.scopes.last_mut() {
if let Some(entry) = scope.iter_mut().find(|(k, _)| k == &key) {
entry.1 = value;
return;
}
scope.push((key, value));
}
}
pub fn get(&self, key: &K) -> Option<&V> {
for scope in self.scopes.iter().rev() {
if let Some((_, v)) = scope.iter().rev().find(|(k, _)| k == key) {
return Some(v);
}
}
None
}
pub fn contains_key(&self, key: &K) -> bool {
self.get(key).is_some()
}
pub fn depth(&self) -> usize {
self.scopes.len()
}
pub fn total_bindings(&self) -> usize {
self.scopes.iter().map(|s| s.len()).sum()
}
pub fn clear(&mut self) {
self.scopes.clear();
self.scopes.push(Vec::new());
}
}
#[derive(Debug, Clone)]
pub struct FreqMap<K: PartialEq + Clone> {
pub(super) counts: AssocMap<K, usize>,
}
impl<K: PartialEq + Clone> FreqMap<K> {
pub fn new() -> Self {
Self::default()
}
pub fn record(&mut self, key: K) {
if let Some(c) = self.counts.get_mut(&key) {
*c += 1;
} else {
self.counts.insert(key, 1);
}
}
pub fn count(&self, key: &K) -> usize {
*self.counts.get(key).unwrap_or(&0)
}
pub fn most_common(&self) -> Option<(&K, usize)> {
self.counts
.iter()
.map(|(k, c)| (k, *c))
.max_by_key(|(_, c)| *c)
}
pub fn distinct_keys(&self) -> usize {
self.counts.len()
}
pub fn total_count(&self) -> usize {
self.counts.values().sum()
}
pub fn is_empty(&self) -> bool {
self.counts.is_empty()
}
pub fn clear(&mut self) {
self.counts.clear();
}
}
#[derive(Debug, Clone)]
pub struct IndexedMap<V: Clone> {
pub(super) slots: Vec<Option<V>>,
pub(super) count: usize,
}
impl<V: Clone> IndexedMap<V> {
pub fn new() -> Self {
Self::default()
}
pub fn insert(&mut self, index: usize, value: V) {
if index >= self.slots.len() {
self.slots.resize(index + 1, None);
}
if self.slots[index].is_none() {
self.count += 1;
}
self.slots[index] = Some(value);
}
pub fn get(&self, index: usize) -> Option<&V> {
self.slots.get(index).and_then(|s| s.as_ref())
}
pub fn remove(&mut self, index: usize) -> Option<V> {
let slot = self.slots.get_mut(index)?;
let old = slot.take()?;
self.count -= 1;
Some(old)
}
pub fn contains(&self, index: usize) -> bool {
self.get(index).is_some()
}
pub fn len(&self) -> usize {
self.count
}
pub fn is_empty(&self) -> bool {
self.count == 0
}
pub fn capacity(&self) -> usize {
self.slots.len()
}
pub fn iter(&self) -> impl Iterator<Item = (usize, &V)> {
self.slots
.iter()
.enumerate()
.filter_map(|(i, s)| s.as_ref().map(|v| (i, v)))
}
pub fn clear(&mut self) {
self.slots.clear();
self.count = 0;
}
}
#[allow(dead_code)]
pub struct HashMapDiff<K, V> {
pub added: std::collections::HashMap<K, V>,
pub removed: std::collections::HashSet<K>,
}