impl View traits for Option<V>
This commit is contained in:
parent
c2b4683a1a
commit
6aef446134
7 changed files with 51 additions and 29 deletions
|
@ -13,12 +13,15 @@ pub trait View : Send + Sync {
|
|||
|
||||
use std::sync::{Arc, RwLock};
|
||||
|
||||
impl<V: View> View for RwLock<V> {
|
||||
impl<V: View + ?Sized> View for RwLock<V> {
|
||||
type Msg = V::Msg;
|
||||
}
|
||||
|
||||
impl<V: View> View for Arc<V> {
|
||||
impl<V: View + ?Sized> View for Arc<V> {
|
||||
type Msg = V::Msg;
|
||||
}
|
||||
|
||||
impl<V: View> View for Option<V> {
|
||||
type Msg = V::Msg;
|
||||
}
|
||||
|
||||
|
|
|
@ -78,11 +78,11 @@ where SrcView: IndexView<Key> + ?Sized,
|
|||
type Item = DstItem;
|
||||
|
||||
fn get(&self, key: &Key) -> Option<Self::Item> {
|
||||
self.src_view.as_ref()?.get(key).as_ref().map(|item| (self.f)(key, item))
|
||||
self.src_view.get(key).as_ref().map(|item| (self.f)(key, item))
|
||||
}
|
||||
|
||||
fn area(&self) -> Option<Vec<Key>> {
|
||||
self.src_view.as_ref()?.area()
|
||||
self.src_view.area()
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
@ -88,11 +88,11 @@ where SrcView: IndexView<SrcKey> + ?Sized,
|
|||
type Item = SrcView::Item;
|
||||
|
||||
fn get(&self, key: &DstKey) -> Option<Self::Item> {
|
||||
self.src_view.as_ref()?.get(&(self.f2)(key)?)
|
||||
self.src_view.get(&(self.f2)(key)?)
|
||||
}
|
||||
|
||||
fn area(&self) -> Option<Vec<DstKey>> {
|
||||
Some(self.src_view.as_ref()?.area()?.iter().map(&self.f1).collect())
|
||||
Some(self.src_view.area()?.iter().map(&self.f1).collect())
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
@ -25,7 +25,7 @@ pub trait IndexView<Key> : View<Msg = Key> {
|
|||
|
||||
//<<<<>>>><<>><><<>><<<*>>><<>><><<>><<<<>>>>
|
||||
|
||||
impl<Key, V: IndexView<Key>> IndexView<Key> for RwLock<V> {
|
||||
impl<Key, V: IndexView<Key> + ?Sized> IndexView<Key> for RwLock<V> {
|
||||
type Item = V::Item;
|
||||
|
||||
fn get(&self, key: &Key) -> Option<Self::Item> {
|
||||
|
@ -37,7 +37,7 @@ impl<Key, V: IndexView<Key>> IndexView<Key> for RwLock<V> {
|
|||
}
|
||||
}
|
||||
|
||||
impl<Key, V: IndexView<Key>> IndexView<Key> for Arc<V> {
|
||||
impl<Key, V: IndexView<Key> + ?Sized> IndexView<Key> for Arc<V> {
|
||||
type Item = V::Item;
|
||||
|
||||
fn get(&self, key: &Key) -> Option<Self::Item> {
|
||||
|
@ -49,6 +49,22 @@ impl<Key, V: IndexView<Key>> IndexView<Key> for Arc<V> {
|
|||
}
|
||||
}
|
||||
|
||||
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())
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
//<<<<>>>><<>><><<>><<<*>>><<>><><<>><<<<>>>>
|
||||
|
||||
pub trait ImplIndexView : Send + Sync {
|
||||
|
|
|
@ -25,7 +25,7 @@ use std::{
|
|||
ops::{Deref}
|
||||
};
|
||||
|
||||
impl<V: SequenceView> SequenceView for RwLock<V> {
|
||||
impl<V: SequenceView + ?Sized> SequenceView for RwLock<V> {
|
||||
type Item = V::Item;
|
||||
|
||||
fn get(&self, idx: &usize) -> Option<Self::Item> {
|
||||
|
@ -37,7 +37,7 @@ impl<V: SequenceView> SequenceView for RwLock<V> {
|
|||
}
|
||||
}
|
||||
|
||||
impl<V: SequenceView> SequenceView for Arc<V> {
|
||||
impl<V: SequenceView + ?Sized> SequenceView for Arc<V> {
|
||||
type Item = V::Item;
|
||||
|
||||
fn get(&self, idx: &usize) -> Option<Self::Item> {
|
||||
|
@ -49,4 +49,19 @@ impl<V: SequenceView> SequenceView for Arc<V> {
|
|||
}
|
||||
}
|
||||
|
||||
impl<V: SequenceView> SequenceView for Option<V> {
|
||||
type Item = V::Item;
|
||||
|
||||
fn get(&self, idx: &usize) -> Option<Self::Item> {
|
||||
(self.as_ref()? as &V).get(idx)
|
||||
}
|
||||
|
||||
fn len(&self) -> Option<usize> {
|
||||
if let Some(v) = self.as_ref() {
|
||||
v.len()
|
||||
} else {
|
||||
Some(0)
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
@ -53,12 +53,11 @@ where SrcView: SequenceView + ?Sized + 'static {
|
|||
type Item = SrcView::Item;
|
||||
|
||||
fn get(&self, key: &usize) -> Option<Self::Item> {
|
||||
self.src_view.as_ref()?.get(key)
|
||||
self.src_view.get(key)
|
||||
}
|
||||
|
||||
fn area(&self) -> Option<Vec<usize>> {
|
||||
let len = self.src_view.as_ref()?.len()?;
|
||||
Some((0 .. len).collect())
|
||||
Some((0 .. self.src_view.len()?).collect())
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
@ -9,6 +9,7 @@ use {
|
|||
|
||||
//<<<<>>>><<>><><<>><<<*>>><<>><><<>><<<<>>>>
|
||||
|
||||
#[derive(Clone)]
|
||||
pub struct StringEditor {
|
||||
data: VecBuffer<char>,
|
||||
cursor: SingletonBuffer<usize>,
|
||||
|
@ -34,11 +35,11 @@ impl StringEditor {
|
|||
pub fn get_data_port(&self) -> OuterViewPort<RwLock<Vec<char>>> {
|
||||
self.data_port.outer()
|
||||
}
|
||||
|
||||
|
||||
pub fn get_cursor_port(&self) -> OuterViewPort<dyn SingletonView<Item = usize>> {
|
||||
self.cursor_port.outer()
|
||||
}
|
||||
|
||||
|
||||
pub fn goto(&mut self, new_pos: usize) {
|
||||
if new_pos <= self.data.len() {
|
||||
self.cursor.set(new_pos);
|
||||
|
@ -123,21 +124,9 @@ pub mod insert_view {
|
|||
|
||||
impl Observer<dyn SequenceView<Item = char>> for DataObserver {
|
||||
fn reset(&mut self, new_data: Option<Arc<dyn SequenceView<Item = char>>>) {
|
||||
let old_len =
|
||||
if let Some(data) = self.data.as_ref() {
|
||||
data.len().unwrap_or(0)
|
||||
} else {
|
||||
0
|
||||
};
|
||||
|
||||
let old_len = self.data.len().unwrap_or(0);
|
||||
self.data = new_data;
|
||||
|
||||
let new_len =
|
||||
if let Some(data) = self.data.as_ref() {
|
||||
data.len().unwrap_or(0)
|
||||
} else {
|
||||
0
|
||||
};
|
||||
let new_len = self.data.len().unwrap_or(0);
|
||||
|
||||
self.edit
|
||||
.upgrade().unwrap()
|
||||
|
|
Loading…
Reference in a new issue