1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46
use crate::core::{PurrHillClimbModel, PurrModel, PurrShape, PurrState}; use crossbeam_channel::{Receiver, Sender}; pub enum PurrWorkerCmd { Start, UpdateScore(f64), End, } pub struct PurrWorker<T: PurrShape> { model: PurrHillClimbModel, rx: Receiver<PurrWorkerCmd>, tx: Sender<PurrState<T>>, } impl<T: PurrShape> PurrWorker<T> { pub fn new( model: PurrHillClimbModel, rx: Receiver<PurrWorkerCmd>, tx: Sender<PurrState<T>>, ) -> Self { PurrWorker { model, rx, tx } } pub fn start(&mut self) { loop { let cmd = self.rx.recv().unwrap(); match cmd { PurrWorkerCmd::Start => { self.work(); } PurrWorkerCmd::UpdateScore(s) => { self.model.context.score = s; } PurrWorkerCmd::End => { return; } } } } pub fn work(&mut self) { let state = self.model.step(); self.tx.send(state).unwrap(); } }