standing_relations/core/op/
save.rs

1use 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}