/
Channel.pm6
38 lines (34 loc) · 868 Bytes
/
Channel.pm6
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
use Event::Emitter::Role::Handler;
unit role Event::Emitter::Channel does Event::Emitter::Role::Handler;
has @!events;
has Channel $!channel;
has $!promise;
submethod BUILD {
$!channel := Channel.new;
$!promise := start {
loop {
my $msg = $!channel.receive;
CATCH { last when X::Channel::ReceiveOnClosed }
$_<callable>.($msg<data>) for @!events.grep(-> $e {
given ($e<event>.WHAT) {
when Regex { $msg<event> ~~ $e<event> }
when Callable { $e<event>.($msg<event>); }
default { $e<event> eq $msg<event> }
};
});
}
};
END {
$!channel.close;
await $!promise;
};
}
method on($event, Callable $callable) {
@!events.push({
event => $event,
callable => $callable,
});
}
method emit($event, $data? = Nil) {
$!channel.send({ event => $event, data => $data });
}