standing_relations/core/
pipes.rs1use 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}