lib-nested/nested/src/index/mod.rs

131 lines
2.6 KiB
Rust
Raw Normal View History

2021-11-19 12:19:52 +01:00
pub mod buffer;
2021-01-12 23:13:27 +01:00
pub mod map_item;
pub mod map_key;
2021-01-12 23:13:27 +01:00
2021-01-06 21:35:46 +01:00
use {
2021-11-19 12:19:52 +01:00
crate::core::View,
std::sync::RwLock,
2021-01-06 21:35:46 +01:00
std::{
ops::{Deref, RangeInclusive},
2021-11-19 12:19:52 +01:00
sync::Arc,
2021-01-06 21:35:46 +01:00
},
};
//<<<<>>>><<>><><<>><<<*>>><<>><><<>><<<<>>>>
#[derive(Clone)]
pub enum IndexArea<Key> {
Empty,
Full,
Set(Vec<Key>),
Range(RangeInclusive<Key>),
//Procedural(Arc<dyn Fn() -> Box<dyn Iterator<Item = Key>>>)
}
impl<Key> IndexArea<Key> {
pub fn map<T>(&self, f: impl Fn(&Key) -> T) -> IndexArea<T> {
match self {
IndexArea::Empty => IndexArea::Empty,
IndexArea::Full => IndexArea::Full,
IndexArea::Set(v) => IndexArea::Set(v.iter().map(&f).collect()),
2021-11-19 12:19:52 +01:00
IndexArea::Range(r) => IndexArea::Range(f(&r.start())..=f(&r.end())),
}
}
}
2021-11-19 12:19:52 +01:00
pub trait IndexView<Key>: View<Msg = IndexArea<Key>>
where
Key: Send + Sync,
{
2021-01-06 21:35:46 +01:00
type Item;
fn get(&self, key: &Key) -> Option<Self::Item>;
2021-01-06 21:35:46 +01:00
fn area(&self) -> IndexArea<Key> {
IndexArea::Full
2021-01-06 21:35:46 +01:00
}
}
//<<<<>>>><<>><><<>><<<*>>><<>><><<>><<<<>>>>
impl<Key, V> IndexView<Key> for RwLock<V>
2021-11-19 12:19:52 +01:00
where
Key: Send + Sync,
V: IndexView<Key> + ?Sized,
{
2021-01-06 21:35:46 +01:00
type Item = V::Item;
fn get(&self, key: &Key) -> Option<Self::Item> {
2021-01-06 21:35:46 +01:00
self.read().unwrap().get(key)
}
fn area(&self) -> IndexArea<Key> {
self.read().unwrap().area()
2021-01-06 21:35:46 +01:00
}
}
impl<Key, V> IndexView<Key> for Arc<V>
2021-11-19 12:19:52 +01:00
where
Key: Send + Sync,
V: IndexView<Key> + ?Sized,
{
2021-01-06 21:35:46 +01:00
type Item = V::Item;
fn get(&self, key: &Key) -> Option<Self::Item> {
2021-01-06 21:35:46 +01:00
self.deref().get(key)
}
fn area(&self) -> IndexArea<Key> {
self.deref().area()
2021-01-06 21:35:46 +01:00
}
}
impl<Key, V> IndexView<Key> for Option<V>
2021-11-19 12:19:52 +01:00
where
Key: Send + Sync,
V: IndexView<Key>,
{
2021-01-19 22:54:50 +01:00
type Item = V::Item;
fn get(&self, key: &Key) -> Option<Self::Item> {
self.as_ref()?.get(key)
2021-01-19 22:54:50 +01:00
}
fn area(&self) -> IndexArea<Key> {
2021-01-19 22:54:50 +01:00
if let Some(v) = self.as_ref() {
v.area()
} else {
IndexArea::Empty
2021-01-19 22:54:50 +01:00
}
}
}
2021-01-06 21:35:46 +01:00
//<<<<>>>><<>><><<>><<<*>>><<>><><<>><<<<>>>>
/*
2021-01-06 21:35:46 +01:00
pub trait ImplIndexView : Send + Sync {
type Key : Send + Sync;
2021-01-06 21:35:46 +01:00
type Value;
fn get(&self, key: &Self::Key) -> Option<Self::Value>;
fn area(&self) -> Option<Vec<Self::Key>> {
2021-01-06 21:35:46 +01:00
None
2021-11-19 12:19:52 +01:00
}
2021-01-06 21:35:46 +01:00
}
impl<V: ImplIndexView> View for V {
type Msg = V::Key;
}
impl<V: ImplIndexView> IndexView<V::Key> for V {
type Item = V::Value;
fn get(&self, key: &V::Key) -> Option<Self::Item> {
2021-01-06 21:35:46 +01:00
(self as &V).get(key)
}
fn area(&self) -> Option<Vec<V::Key>> {
(self as &V).area()
2021-01-06 21:35:46 +01:00
}
}
*/