standing_relations/core/
pipes.rs

1use std::{
2    cell::RefCell,
3    mem,
4    rc::Rc,
5    sync::{
6        atomic::{AtomicUsize, Ordering},
7        Arc,
8    },
9};
10
11pub struct Sender<T>(Rc<RefCell<Vec<T>>>);
12
13impl<T> Clone for Sender<T> {
14    fn clone(&self) -> Self {
15        Sender(Rc::clone(&self.0))
16    }
17}
18
19pub struct Receiver<T>(Rc<RefCell<Vec<T>>>);
20
21impl<T> Sender<T> {
22    pub fn send(&mut self, data: T) {
23        self.0.borrow_mut().push(data)
24    }
25    pub fn send_all(&mut self, data: Vec<T>) {
26        self.0.borrow_mut().extend(data)
27    }
28}
29
30impl<T> Receiver<T> {
31    pub fn receive(&mut self) -> Vec<T> {
32        mem::take(&mut self.0.borrow_mut())
33    }
34}
35
36pub fn new<T>() -> (Sender<T>, Receiver<T>) {
37    let rc = Default::default();
38    (Sender(Rc::clone(&rc)), Receiver(rc))
39}
40
41#[derive(Clone)]
42pub struct CountSender(Arc<AtomicUsize>);
43impl CountSender {
44    pub fn increment(&mut self) {
45        self.0.fetch_add(1, Ordering::Relaxed);
46    }
47}
48
49#[derive(Clone)]
50pub struct CountReceiver(Arc<AtomicUsize>);
51impl CountReceiver {
52    pub fn get(&self) -> usize {
53        self.0.load(Ordering::Relaxed)
54    }
55}
56
57pub fn new_count() -> (CountSender, CountReceiver) {
58    let arc = Arc::new(AtomicUsize::new(0));
59    (CountSender(Arc::clone(&arc)), CountReceiver(arc))
60}