1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110
use crate::Property; use crate::TryIter; use crate::Parameter; use std::ops::Index; use std::rc::Rc; #[cfg(feature = "async")] use crate::{ReceiverAsync, StreamExt}; #[derive(Default)] pub struct IndexedProperty<'a, C, I> where C: Index<I>, I: Clone + 'a, <C as Index<I>>::Output: 'a, { collection: Rc<C>, index: Property<'a, I> } impl<'a,C,I> Clone for IndexedProperty<'a, C, I> where C: Index<I>, I: Clone + 'a, <C as Index<I>>::Output: 'a, { fn clone(&self) -> Self { IndexedProperty { collection: self.collection.clone(), index: self.index.clone(), } } } impl<'a, C, I> IndexedProperty<'a, C, I> where C: Index<I> + 'a, I: Clone + 'a, <C as Index<I>>::Output: 'a, { pub fn new(collection: C, initial_index: I) -> IndexedProperty<'a, C, I> { IndexedProperty{ collection: Rc::new(collection), index: Property::new(initial_index), } } pub fn from_index_property(collection: C, index: Property<'a, I>) -> IndexedProperty<'a, C, I> { IndexedProperty{ collection: Rc::new(collection), index, } } pub fn get(&self) -> &<C as Index<I>>::Output{ &self.collection[self.index.get().clone()] } pub fn current_index(&self) -> I { self.index.get().clone() } pub fn set(&mut self, index: I) { self.index.set(index) } pub fn collection(&self) -> &C { &self.collection } pub fn index_property(&self) -> &Property<'a,I>{ &self.index } pub fn index_property_mut(&mut self) -> &mut Property<'a,I>{ &mut self.index } } impl<'a, C, I> IndexedProperty<'a, C, I> where C: Index<I> + 'a, I: Clone + 'a, <C as Index<I>>::Output: 'a + Clone, { #[cfg(feature = "async")] pub fn receiver_async<'b>(self) -> ReceiverAsync<'b, <C as Index<I>>::Output> where 'a: 'b{ let initial = self.get().clone(); let collection = self.collection; let stream = self.index.stream().map(move |i| collection[i].clone()); ReceiverAsync::new_initial(stream, initial) } } impl<'a, C, I> IndexedProperty<'a, C, I> where C: Index<I> + 'a, I: Clone + 'a, <C as Index<I>>::Output: Clone + 'a, { pub fn try_iter<'b>(self) -> TryIter<'b, <C as Index<I>>::Output> where 'a: 'b{ let collection = self.collection; self.index.map(move |i| collection[i].clone()).try_iter() } pub fn to_parameter<'b>(self) -> Parameter<'b, <C as Index<I>>::Output> where 'a: 'b{ let initial = self.get().clone(); Parameter::from_parent(self.try_iter(), initial) } pub fn into_property(self) -> Property<'a, <C as Index<I>>::Output>{ let collection = self.collection; self.index.map(move |i| collection[i].clone()) } }