-
Notifications
You must be signed in to change notification settings - Fork 0
/
runner.p6
executable file
·70 lines (60 loc) · 2.03 KB
/
runner.p6
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
#!/usr/bin/env perl6
use lib "lib";
use Event::Runner;
my @rules =
{
cmd => "query",
query => %( :type("==" => "temperature"), :value(">" => 40) ),
id => "#temp",
store => < value area >,
next => {
cmd => "query",
query => %( :type("==" => "humidity"), :value("<" => 20), :area("==" => -> %state { %state<#temp><area> }) ),
id => "#hum",
store => < value area >,
next => {
cmd => "dispatch",
data => -> %state --> Hash() { :type<fire-risk>, :area(%state<#temp><area>), :temperature(%state<#temp><value>), :humidity(%state<#hum><value>) },
}
}
},
{
cmd => "query",
query => %( :type("==" => "humidity"), :value("<" => 20) ),
id => "#hum",
store => < value area >,
next => {
cmd => "query",
query => %( :type("==" => "temperature"), :value(">" => 40), :area("==" => -> %state { %state<#hum><area> }) ),
id => "#temp",
store => < value area >,
next => {
cmd => "dispatch",
data => -> %state --> Hash() { :type<fire-risk>, :area(%state<#temp><area>), :temperature(%state<#temp><value>), :humidity(%state<#hum><value>) },
}
}
}
;
my Supplier $supplier .= new;
my Event::Runner $runner .= new: :supply($supplier.Supply), :@rules;
$runner.run.tap: { say "EMIT: { .perl }" };
multi MAIN() {
sleep 1;
$supplier.emit: %(:type<temperature>, :value(45), :area<abc>);
sleep 1;
$supplier.emit: %(:type<humidity>, :value(13), :area<abc>);
sleep 2;
}
multi MAIN("rand") {
sleep 1;
loop {
sleep 1;
my $event = %(
:type(<temperature humidity>.pick),
:value((^100).pick),
:area(<abc cde efg>.pick)
);
dd $event;
$supplier.emit: $event
}
}