From 45e66495cc74b9be63263a7be928e2f2688d5c5e Mon Sep 17 00:00:00 2001 From: Eduard Bopp Date: Wed, 14 Jan 2015 11:47:00 +0100 Subject: [PATCH] Setup some publish/subscribe pattern --- .gitignore | 2 ++ Cargo.toml | 5 +++++ src/lib.rs | 1 + src/subject.rs | 46 ++++++++++++++++++++++++++++++++++++++++++++++ 4 files changed, 54 insertions(+) create mode 100644 .gitignore create mode 100644 Cargo.toml create mode 100644 src/lib.rs create mode 100644 src/subject.rs diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..4fffb2f --- /dev/null +++ b/.gitignore @@ -0,0 +1,2 @@ +/target +/Cargo.lock diff --git a/Cargo.toml b/Cargo.toml new file mode 100644 index 0000000..8e53df9 --- /dev/null +++ b/Cargo.toml @@ -0,0 +1,5 @@ +[package] + +name = "rustfrp" +version = "0.0.1" +authors = ["Eduard Bopp "] diff --git a/src/lib.rs b/src/lib.rs new file mode 100644 index 0000000..edca1b9 --- /dev/null +++ b/src/lib.rs @@ -0,0 +1 @@ +mod subject; diff --git a/src/subject.rs b/src/subject.rs new file mode 100644 index 0000000..cfc6d40 --- /dev/null +++ b/src/subject.rs @@ -0,0 +1,46 @@ +use std::sync::mpsc::{channel, Sender, Receiver}; + +pub struct Subject { + senders: Vec>, +} + +impl Subject { + pub fn new() -> Subject { + Subject { senders: Vec::new() } + } + + pub fn listen(&mut self) -> Receiver { + let (tx, rx) = channel::(); + self.senders.push(tx); + rx + } + + pub fn send(&mut self, a: A) { + let mut idx_to_remove = vec!(); + for (k, tx) in self.senders.iter().enumerate() { + match tx.send(a.clone()) { + Ok(_) => (), + Err(_) => idx_to_remove.push(k), + } + } + for k in idx_to_remove.into_iter() { + self.senders.remove(k); + } + } +} + + +#[cfg(test)] +mod test { + use super::*; + + #[test] + fn two_receivers() { + let mut sub = Subject::new(); + let r1 = sub.listen(); + let r2 = sub.listen(); + sub.send(3); + assert_eq!(r1.recv(), Ok(3)); + assert_eq!(r2.recv(), Ok(3)); + } +}