Skip to content

Commit 0b5b55b

Browse files
committed
fudging supply/promise/channel for parrot
1 parent cc7720a commit 0b5b55b

File tree

2 files changed

+171
-159
lines changed

2 files changed

+171
-159
lines changed

integration/advent2013-day14.t

Lines changed: 139 additions & 131 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@ plan 10;
44

55
# Promises
66

7+
#?rakudo.parrot skip 'no implementation of promise/channel'
78
{
89
my $p1000 = start {
910
(1..Inf).grep(*.is-prime)[999]
@@ -27,6 +28,7 @@ my @currency_exchanges = (CurrencyExchange.new( :id<fast>, :delay(1) ),
2728
CurrencyExchange.new( :id<slow>, :delay(7) ), # wont finish in 5 sec
2829
);
2930

31+
#?rakudo.parrot skip 'no implementation of promise/channel'
3032
#?rakudo.moar skip 'Promise.in'
3133
{
3234
my $val = 42;
@@ -37,6 +39,7 @@ my @currency_exchanges = (CurrencyExchange.new( :id<fast>, :delay(1) ),
3739
is_deeply @quotes, [42, 42*3], 'quotes example';
3840
}
3941

42+
#?rakudo.parrot skip 'no implementation of promise/channel'
4043
{
4144
my $p1000 = start {
4245
(1..Inf).grep(*.is-prime)[999]
@@ -51,6 +54,7 @@ my @currency_exchanges = (CurrencyExchange.new( :id<fast>, :delay(1) ),
5154
is $pwrite.result, 'p1000.txt', '.then chaining';
5255
}
5356

57+
#?rakudo.parrot skip 'no implementation of promise/channel'
5458
{
5559
# Create the promise.
5660
my $p = Promise.new;
@@ -64,6 +68,7 @@ my @currency_exchanges = (CurrencyExchange.new( :id<fast>, :delay(1) ),
6468
is $p.status, 'Kept', 'kept promise';
6569
}
6670

71+
#?rakudo.parrot skip 'no implementation of promise/channel'
6772
{
6873
# Create the promise.
6974
my $p = Promise.new;
@@ -79,145 +84,148 @@ my @currency_exchanges = (CurrencyExchange.new( :id<fast>, :delay(1) ),
7984
# Channels
8085

8186
#?rakudo.moar skip 'combined config example'
87+
#?rakudo.parrot skip 'no implementation of promise/channel'
8288
{
83-
my @files = qw<config1.ini config2.ini>;
84-
my %config = read_all(@files);
85-
is %config<font><size>, '10', 'combined config (font/size)';
86-
is %config<font><style>, 'italic', 'combined config (font/style)';
87-
is %config<font><color>, 'red', 'combined config (font/color)';
88-
is %config<line><style>, 'dashed', 'combined config (line/style)';
89-
}
90-
91-
sub read_all(@files) {
92-
my $read = Channel.new;
93-
my $parsed = Channel.new;
94-
read_worker(@files, $read);
95-
parse_worker($read, $parsed);
96-
my %all_config = await config_combiner($parsed);
97-
$read.close; $parsed.close;
98-
return %all_config;
99-
}
100-
101-
sub read_worker(@files, $dest) {
102-
103-
# simulated slurp()
104-
sub Slurp($name) {
105-
my %files = (
106-
'config1.ini' => q:to"END1",
107-
[font]
108-
size = 10
109-
style = italic
110-
[line]
111-
style = dashed
112-
END1
113-
'config2.ini' => q:to"END2",
114-
[font]
115-
color = red
116-
[line]
117-
height = 0.5
118-
END2
119-
);
120-
return %files{$name}
89+
{
90+
my @files = qw<config1.ini config2.ini>;
91+
my %config = read_all(@files);
92+
is %config<font><size>, '10', 'combined config (font/size)';
93+
is %config<font><style>, 'italic', 'combined config (font/style)';
94+
is %config<font><color>, 'red', 'combined config (font/color)';
95+
is %config<line><style>, 'dashed', 'combined config (line/style)';
12196
}
12297

123-
start {
124-
for @files -> $file {
125-
$dest.send( Slurp($file) );
126-
}
127-
$dest.close();
128-
CATCH { diag 'read_worker failure:' ~ $_; $dest.fail($_) }
98+
sub read_all(@files) {
99+
my $read = Channel.new;
100+
my $parsed = Channel.new;
101+
read_worker(@files, $read);
102+
parse_worker($read, $parsed);
103+
my %all_config = await config_combiner($parsed);
104+
$read.close; $parsed.close;
105+
return %all_config;
129106
}
130-
}
131107

132-
sub parse_worker($source, $dest) {
133-
my grammar INIFile {
134-
token TOP {
135-
^
136-
<entries>
137-
<section>+
138-
$
139-
}
140-
141-
token section {
142-
'[' ~ ']' <key> \n
143-
<entries>
144-
}
145-
146-
token entries {
147-
[
148-
| <entry> \n
149-
| \n
150-
]*
151-
}
152-
153-
rule entry { <key> '=' <value> }
154-
155-
token key { \w+ }
156-
token value { \N+ }
157-
158-
token ws { \h* }
159-
}
160-
161-
my class INIFileActions {
162-
method TOP($/) {
163-
my %result;
164-
%result<_> = $<entries>.ast;
165-
## for $<section> -> $sec {
166-
for @<section> -> $sec {
167-
%result{$sec<key>} = $sec<entries>.ast;
168-
}
169-
make %result;
170-
}
171-
172-
method entries($/) {
173-
my %entries;
174-
## for $<entry> -> $e {
175-
for @<entry> -> $e {
176-
%entries{$e<key>} = ~$e<value>;
177-
}
178-
make %entries;
179-
}
108+
sub read_worker(@files, $dest) {
109+
110+
# simulated slurp()
111+
sub Slurp($name) {
112+
my %files = (
113+
'config1.ini' => q:to"END1",
114+
[font]
115+
size = 10
116+
style = italic
117+
[line]
118+
style = dashed
119+
END1
120+
'config2.ini' => q:to"END2",
121+
[font]
122+
color = red
123+
[line]
124+
height = 0.5
125+
END2
126+
);
127+
return %files{$name}
128+
}
129+
130+
start {
131+
for @files -> $file {
132+
$dest.send( Slurp($file) );
133+
}
134+
$dest.close();
135+
CATCH { diag 'read_worker failure:' ~ $_; $dest.fail($_) }
136+
}
180137
}
181138

182-
start {
183-
loop {
184-
winner $source {
185-
more $source {
186-
if INIFile.parse($_, :actions(INIFileActions)) -> $parsed {
187-
$dest.send($parsed.ast);
188-
}
189-
else {
190-
$dest.fail("Could not parse INI file");
191-
last;
192-
}
193-
}
194-
done $source { last }
195-
}
196-
}
197-
$dest.close();
198-
CATCH { diag 'parse worker failure:' ~ $_; $dest.fail($_) }
139+
sub parse_worker($source, $dest) {
140+
my grammar INIFile {
141+
token TOP {
142+
^
143+
<entries>
144+
<section>+
145+
$
146+
}
147+
148+
token section {
149+
'[' ~ ']' <key> \n
150+
<entries>
151+
}
152+
153+
token entries {
154+
[
155+
| <entry> \n
156+
| \n
157+
]*
158+
}
159+
160+
rule entry { <key> '=' <value> }
161+
162+
token key { \w+ }
163+
token value { \N+ }
164+
165+
token ws { \h* }
166+
}
167+
168+
my class INIFileActions {
169+
method TOP($/) {
170+
my %result;
171+
%result<_> = $<entries>.ast;
172+
## for $<section> -> $sec {
173+
for @<section> -> $sec {
174+
%result{$sec<key>} = $sec<entries>.ast;
175+
}
176+
make %result;
177+
}
178+
179+
method entries($/) {
180+
my %entries;
181+
## for $<entry> -> $e {
182+
for @<entry> -> $e {
183+
%entries{$e<key>} = ~$e<value>;
184+
}
185+
make %entries;
186+
}
187+
}
188+
189+
start {
190+
loop {
191+
winner $source {
192+
more $source {
193+
if INIFile.parse($_, :actions(INIFileActions)) -> $parsed {
194+
$dest.send($parsed.ast);
195+
}
196+
else {
197+
$dest.fail("Could not parse INI file");
198+
last;
199+
}
200+
}
201+
done $source { last }
202+
}
203+
}
204+
$dest.close();
205+
CATCH { diag 'parse worker failure:' ~ $_; $dest.fail($_) }
206+
}
199207
}
200-
}
201208

202-
sub config_combiner($source) {
203-
my $p = Promise.new;
204-
my $v = $p.vow;
205-
start {
206-
my %result;
207-
loop {
208-
winner $source {
209-
more $source {
210-
for %^content.kv -> $sec, %kvs {
211-
for %kvs.kv -> $k, $v {
212-
%result{$sec}{$k} = $v;
213-
}
214-
}
215-
}
216-
done $source { last }
217-
}
218-
}
219-
$v.keep(%result);
220-
CATCH { diag "combiner failure:" ~ $_; $v.break($_) }
209+
sub config_combiner($source) {
210+
my $p = Promise.new;
211+
my $v = $p.vow;
212+
start {
213+
my %result;
214+
loop {
215+
winner $source {
216+
more $source {
217+
for %^content.kv -> $sec, %kvs {
218+
for %kvs.kv -> $k, $v {
219+
%result{$sec}{$k} = $v;
220+
}
221+
}
222+
}
223+
done $source { last }
224+
}
225+
}
226+
$v.keep(%result);
227+
CATCH { diag "combiner failure:" ~ $_; $v.break($_) }
228+
}
229+
return $p;
221230
}
222-
return $p;
223231
}

integration/advent2013-day19.t

Lines changed: 32 additions & 28 deletions
Original file line numberDiff line numberDiff line change
@@ -2,44 +2,48 @@ use v6;
22
use Test;
33
plan 20;
44

5-
my $measurements = Supply.new;
5+
#?rakudo.parrot skip 'no implementation of supply'
6+
{
7+
my $measurements = Supply.new;
68

7-
my $measured = 0;
8-
sub measure_ok($test) {
9-
++$measured;
10-
pass $test;
11-
}
9+
my $measured = 0;
10+
sub measure_ok($test) {
11+
++$measured;
12+
pass $test;
13+
}
1214

13-
$measurements.tap(-> $value {
14-
measure_ok("Measured: $value");
15-
});
15+
$measurements.tap(-> $value {
16+
measure_ok("Measured: $value");
17+
});
1618

17-
$measurements.more(1.5);
18-
$measurements.more(2.3);
19-
$measurements.more(4.6);
20-
is $measured, 3, 'supply - singular tap';
19+
$measurements.more(1.5);
20+
$measurements.more(2.3);
21+
$measurements.more(4.6);
22+
is $measured, 3, 'supply - singular tap';
2123

22-
$measured = 0;
23-
$measurements.tap(-> $value {
24-
measure_ok "Also measured: $value";
25-
});
24+
$measured = 0;
25+
$measurements.tap(-> $value {
26+
measure_ok "Also measured: $value";
27+
});
2628

27-
$measurements.more(2.8);
29+
$measurements.more(2.8);
2830

29-
is $measured, 2, 'supply dual tap';
31+
is $measured, 2, 'supply dual tap';
3032

31-
$measurements.grep(* > 4).tap(-> $value {
32-
measure_ok "HIGH: $value";
33-
});
33+
$measurements.grep(* > 4).tap(-> $value {
34+
measure_ok "HIGH: $value";
35+
});
3436

35-
$measured = 0;
36-
$measurements.more(1.6);
37-
is $measured, 2, 'supply grep and tap';
37+
$measured = 0;
38+
$measurements.more(1.6);
39+
is $measured, 2, 'supply grep and tap';
3840

39-
$measured = 0;
40-
$measurements.more(4.5);
41-
is $measured, 3, 'supply grep and tap';
41+
$measured = 0;
42+
$measurements.more(4.5);
43+
is $measured, 3, 'supply grep and tap';
44+
}
4245

46+
#?rakudo.parrot skip 'no implementation of supply'
4347
#?rakudo.moar skip 'Supply.interval on moar'
4448
{
4549
my $n_batches = 0;

0 commit comments

Comments
 (0)