standing_relations/core/op/
save.rs1use std::{
2 cell::{Ref, RefCell},
3 rc::Rc,
4};
5
6use crate::core::{
7 context::{ContextTracker, TrackingIndex},
8 dirty::DirtyReceive,
9 pipes::{self, Receiver, Sender},
10 relation::RelationInner,
11 Op_, Relation,
12};
13
14pub struct Save<C: Op_> {
15 inner: Saved<C>,
16 receiver: Receiver<Rc<Vec<C::T>>>,
17}
18
19struct SaveInner<C: Op_> {
20 inner: RelationInner<C>,
21 senders: Vec<Sender<Rc<Vec<C::T>>>>,
22 dirty: DirtyReceive,
23}
24
25pub struct Saved<C: Op_> {
26 context_tracker: ContextTracker,
27 inner: Rc<RefCell<SaveInner<C>>>,
28 tracking_index: TrackingIndex,
29}
30
31impl<C: Op_> Clone for Saved<C> {
32 fn clone(&self) -> Self {
33 Self {
34 context_tracker: self.context_tracker.clone(),
35 inner: Rc::clone(&self.inner),
36 tracking_index: self.tracking_index,
37 }
38 }
39}
40
41impl<C: Op_> Saved<C> {
42 pub fn new(rel: Relation<C>) -> Self {
43 Self {
44 context_tracker: rel.context_tracker,
45 inner: Rc::new(RefCell::new(SaveInner {
46 inner: rel.inner,
47 senders: Vec::new(),
48 dirty: rel.dirty.into_receive(),
49 })),
50 tracking_index: rel.tracking_index,
51 }
52 }
53 pub fn get_shown(&self) -> Relation<Save<C>>
54 where
55 C::T: Clone,
56 {
57 let (sender, receiver) = pipes::new();
58 let dirty = {
59 let mut inner = self.inner.borrow_mut();
60 inner.senders.push(sender);
61 inner.dirty.add_target()
62 };
63 self.context_tracker.clone().add_relation(
64 dirty,
65 Save {
66 inner: self.clone(),
67 receiver,
68 },
69 vec![self.tracking_index],
70 )
71 }
72 pub(super) fn borrow(&self) -> Ref<RelationInner<C>> {
73 Ref::map(self.inner.borrow(), |x| &x.inner)
74 }
75 pub(super) fn propagate(&mut self) {
76 if self.inner.borrow_mut().dirty.take_status() {
77 let data = Rc::new(self.inner.borrow_mut().inner.get_vec());
78 for sender in self.inner.borrow_mut().senders.iter_mut() {
79 sender.send(Rc::clone(&data))
80 }
81 }
82 }
83}
84
85impl<C: Op_> Op_ for Save<C>
86where
87 C::T: Clone,
88{
89 type T = C::T;
90
91 fn foreach<'a>(&'a mut self, mut continuation: impl FnMut(Self::T) + 'a) {
92 self.inner.propagate();
93 for data in self.receiver.receive() {
94 for x in data.iter() {
95 continuation(x.clone())
96 }
97 }
98 }
99
100 fn get_type_name() -> &'static str {
101 "save"
102 }
103}
104
105impl<C: Op_> Relation<C> {
106 pub fn save(self) -> Saved<C>
107 where
108 C::T: Clone,
109 {
110 Saved::new(self)
111 }
112}
113
114impl<C: Op_> Clone for Relation<Save<C>>
115where
116 C::T: Clone,
117{
118 fn clone(&self) -> Self {
119 self.inner.inner.inner.get()
120 }
121}