4
4
5
5
# Promises
6
6
7
+ # ?rakudo.parrot skip 'no implementation of promise/channel'
7
8
{
8
9
my $ p1000 = start {
9
10
(1 .. Inf ). grep (*. is-prime )[999 ]
@@ -27,6 +28,7 @@ my @currency_exchanges = (CurrencyExchange.new( :id<fast>, :delay(1) ),
27
28
CurrencyExchange. new ( : id<slow >, : delay(7 ) ), # wont finish in 5 sec
28
29
);
29
30
31
+ # ?rakudo.parrot skip 'no implementation of promise/channel'
30
32
# ?rakudo.moar skip 'Promise.in'
31
33
{
32
34
my $ val = 42 ;
@@ -37,6 +39,7 @@ my @currency_exchanges = (CurrencyExchange.new( :id<fast>, :delay(1) ),
37
39
is_deeply @ quotes , [42 , 42 * 3 ], ' quotes example' ;
38
40
}
39
41
42
+ # ?rakudo.parrot skip 'no implementation of promise/channel'
40
43
{
41
44
my $ p1000 = start {
42
45
(1 .. Inf ). grep (*. is-prime )[999 ]
@@ -51,6 +54,7 @@ my @currency_exchanges = (CurrencyExchange.new( :id<fast>, :delay(1) ),
51
54
is $ pwrite . result, ' p1000.txt' , ' .then chaining' ;
52
55
}
53
56
57
+ # ?rakudo.parrot skip 'no implementation of promise/channel'
54
58
{
55
59
# Create the promise.
56
60
my $ p = Promise . new ;
@@ -64,6 +68,7 @@ my @currency_exchanges = (CurrencyExchange.new( :id<fast>, :delay(1) ),
64
68
is $ p . status, ' Kept' , ' kept promise' ;
65
69
}
66
70
71
+ # ?rakudo.parrot skip 'no implementation of promise/channel'
67
72
{
68
73
# Create the promise.
69
74
my $ p = Promise . new ;
@@ -79,145 +84,148 @@ my @currency_exchanges = (CurrencyExchange.new( :id<fast>, :delay(1) ),
79
84
# Channels
80
85
81
86
# ?rakudo.moar skip 'combined config example'
87
+ # ?rakudo.parrot skip 'no implementation of promise/channel'
82
88
{
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)' ;
121
96
}
122
97
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 ;
129
106
}
130
- }
131
107
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
+ }
180
137
}
181
138
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
+ }
199
207
}
200
- }
201
208
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 ;
221
230
}
222
- return $ p ;
223
231
}
0 commit comments