lib-nested/src/index/mod.rs

96 lines
1.9 KiB
Rust
Raw Normal View History

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 {
std::{
sync::{Arc, RwLock},
ops::Deref,
2021-01-06 21:35:46 +01:00
},
crate::core::View
};
//<<<<>>>><<>><><<>><<<*>>><<>><><<>><<<<>>>>
pub trait IndexView<Key> : View<Msg = Key> {
type Item;
fn get(&self, key: &Key) -> Option<Self::Item>;
2021-01-06 21:35:46 +01:00
2021-01-16 15:31:37 +01:00
// todo: AreaIterator enum to switch between Allocated and Procedural area
fn area(&self) -> Option<Vec<Key>> {
2021-01-06 21:35:46 +01:00
None
}
}
//<<<<>>>><<>><><<>><<<*>>><<>><><<>><<<<>>>>
2021-01-19 22:54:50 +01:00
impl<Key, V: IndexView<Key> + ?Sized> IndexView<Key> for RwLock<V> {
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) -> Option<Vec<Key>> {
self.read().unwrap().area()
2021-01-06 21:35:46 +01:00
}
}
2021-01-19 22:54:50 +01:00
impl<Key, V: IndexView<Key> + ?Sized> IndexView<Key> for Arc<V> {
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) -> Option<Vec<Key>> {
self.deref().area()
2021-01-06 21:35:46 +01:00
}
}
2021-01-19 22:54:50 +01:00
impl<Key, V: IndexView<Key>> IndexView<Key> for Option<V> {
type Item = V::Item;
fn get(&self, key: &Key) -> Option<Self::Item> {
(self.as_ref()? as &V).get(key)
}
fn area(&self) -> Option<Vec<Key>> {
if let Some(v) = self.as_ref() {
v.area()
} else {
Some(Vec::new())
}
}
}
2021-01-06 21:35:46 +01:00
//<<<<>>>><<>><><<>><<<*>>><<>><><<>><<<<>>>>
pub trait ImplIndexView : Send + Sync {
type Key;
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
}
}
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
}
}