Untitled

 avatar
unknown
plain_text
2 years ago
1.3 kB
5
Indexable
use std::fmt::Debug;
use std::sync::Arc;
use crossbeam::channel::{Receiver, Sender, unbounded};

struct Dispatcher<T: Send + Clone + 'static>{
    sender: Sender<T>,
    receiver: Receiver<T>
}

struct Subscription<T: Send + Clone + Debug + 'static>{
    receiver: Receiver<T>
}

impl<T: Send + Clone + 'static> Dispatcher<T> {
    fn new() -> Self{
        let (sender, receiver) = unbounded();
        return Dispatcher{
            sender,
            receiver
        }
    }

    fn dispatch(&self, msg: T){
        self.sender.send(msg);
    }

    fn subscribe(&self) -> Subscription<T> where T: Debug {
        return Subscription{
            receiver: self.receiver.clone()
        }
    }
}

impl <T: Send + Clone + Debug + 'static> Subscription<T>{
    fn read(&self) -> Option<T>{
        let res = self.receiver.recv().unwrap();
        return Some(res);
    }
}


fn main() {
    let mut threads = Vec::new();
    let str = Arc::new(Dispatcher::new());

    for i in 0..10{
        let strcp = str.clone();
        threads.push(std::thread::spawn(move || {
            if i%2==0 {
                strcp.dispatch(move || "prova");
            } else {
                let subscriber = strcp.subscribe();
                subscriber.read();
            }
        }))
    }
}