aboutsummaryrefslogtreecommitdiff
path: root/rust/src/implementation/passwordmaker/emittingsender.rs
blob: 1cf58fc9851d44075145889681d6d68dd409bea8 (plain) (blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
use std::sync::mpsc::{channel,Sender,Receiver,SendError};
#[derive(Clone)]
pub(crate) struct EmittingSender<MT, E : Fn()> {
    sender : Sender<MT>,
    emit : E,
}

impl <MT, E : Fn()> EmittingSender<MT, E>{
    pub(crate) fn emitting_channel(emit : E) -> (Self, Receiver<MT>) {
        let (sender,r) = channel();
        (EmittingSender { sender, emit }, r)
    }
    pub(crate) fn send(&self, t: MT) -> Result<(), SendError<MT>> {
        //first send, then notify.
        self.sender.send(t).map(|_| (self.emit)())
    }
}