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 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106
use std::sync::mpsc::{ self, Receiver, Sender, TryIter, }; pub trait Slot<T> { fn connector(&self) -> Sender<T>; fn exec_for( &self, t: T, ); fn proxy(&self) -> SlotProxy<T>; } pub struct SlotImpl<T> { receiver: Receiver<T>, sender: Sender<T>, } impl<T> SlotImpl<T> { pub fn new() -> SlotImpl<T> { let (sender, receiver) = mpsc::channel(); return SlotImpl { sender, receiver, }; } pub fn next(&self) -> Option<T> { return self.receiver.try_recv().ok(); } pub fn data_iter(&self) -> TryIter<T> { return self.receiver.try_iter(); } pub fn last(&self) -> Option<T> { return self.data_iter().last(); } pub fn discard_pending(&self) { self.data_iter().last(); } } impl<T> Slot<T> for SlotImpl<T> { fn connector(&self) -> Sender<T> { return self.sender.clone(); } fn exec_for( &self, t: T, ) { match self.sender.send(t) { Ok(_) => trace!("exec_for:ok"), Err(e) => warn!("exec_for:err:{:?}", e), } } fn proxy(&self) -> SlotProxy<T> { return SlotProxy { sender: self.sender.clone(), }; } } #[derive(Clone)] pub struct SlotProxy<T> { sender: Sender<T>, } impl<T> SlotProxy<T> { pub fn empty() -> SlotProxy<T> { let (sender, _) = mpsc::channel(); return SlotProxy { sender, }; } } impl<T> Slot<T> for SlotProxy<T> { fn connector(&self) -> Sender<T> { return self.sender.clone(); } fn exec_for( &self, t: T, ) { match self.sender.send(t) { Ok(_) => trace!("exec_for:ok"), Err(e) => warn!("exec_for:err:{:?}", e), } } fn proxy(&self) -> SlotProxy<T> { return SlotProxy { sender: self.sender.clone(), }; } }