From 22a78bf662d7ba73fb95d62862e73d36f6291ecb Mon Sep 17 00:00:00 2001 From: static Date: Mon, 16 Dec 2024 17:15:56 +0000 Subject: [PATCH] Assignment 12 Done (Except card.rs) --- src/assignments/assignment12/demux.rs | 18 ++++++++++++++++-- src/assignments/assignment12/funnel.rs | 15 ++++++++++++++- .../assignment12/small_exercises.rs | 8 ++++++-- 3 files changed, 36 insertions(+), 5 deletions(-) diff --git a/src/assignments/assignment12/demux.rs b/src/assignments/assignment12/demux.rs index 86b5d11..551f200 100644 --- a/src/assignments/assignment12/demux.rs +++ b/src/assignments/assignment12/demux.rs @@ -28,11 +28,25 @@ impl bool> DemuxSender { /// /// If `f(&value)` is true, send `value` to `tx_true`. Otherwise, send `value` to `tx_false`. pub fn send(&self, value: T) -> Result<(), SendError> { - todo!() + if (self.f)(&value) { + self.tx_true.send(value) + } else { + self.tx_false.send(value) + } } } /// Demux. pub fn demux bool>(f: F) -> (DemuxSender, Receiver, Receiver) { - todo!() + let (tx_true, rx_true) = channel(); + let (tx_false, rx_false) = channel(); + ( + DemuxSender { + tx_true, + tx_false, + f, + }, + rx_true, + rx_false, + ) } diff --git a/src/assignments/assignment12/funnel.rs b/src/assignments/assignment12/funnel.rs index 8cf6dcf..3d6446a 100644 --- a/src/assignments/assignment12/funnel.rs +++ b/src/assignments/assignment12/funnel.rs @@ -19,5 +19,18 @@ where T: Send + 'static, F: Send + Sync + Fn(&T) -> bool + 'static, { - todo!() + let tx = Arc::new(tx); + let f = Arc::new(f); + thread::spawn(move || { + for rx in rxs { + let tx = tx.clone(); + let f = f.clone(); + let _unused = thread::spawn(move || loop { + let v = rx.recv().unwrap(); + if f(&v) { + tx.send(v).unwrap() + } + }); + } + }) } diff --git a/src/assignments/assignment12/small_exercises.rs b/src/assignments/assignment12/small_exercises.rs index 035ac36..ac84e23 100644 --- a/src/assignments/assignment12/small_exercises.rs +++ b/src/assignments/assignment12/small_exercises.rs @@ -13,7 +13,9 @@ use etrace::*; /// Read the `test_ping_pong` function in `small_exercises_grade.rs` to figure out what it should /// do. pub fn pong(rx1: &mut Receiver, tx2: &mut Sender) -> bool { - todo!() + let i = rx1.recv().unwrap(); + tx2.send(i + 1).unwrap(); + i != 99 } /// Executes the given functions (f1, f2) in concurrent and returns the results. @@ -31,5 +33,7 @@ where F1: Send + FnOnce() -> T1 + 'scope, F2: Send + FnOnce() -> T2 + 'scope, { - todo!() + let (t1, t2) = (s.spawn(f1), s.spawn(f2)); + let (v1, v2) = (t1.join(), t2.join()); + (v1.unwrap(), v2.unwrap()) }