restate_sdk/context/
select.rs

1// Thanks tokio for the help!
2// https://github.com/tokio-rs/tokio/blob/a258bff7018940b438e5de3fb846588454df4e4d/tokio/src/macros/select.rs
3// MIT License
4
5/// Select macro, alike tokio::select:
6///
7/// ```rust
8/// # use restate_sdk::prelude::*;
9/// # use std::convert::Infallible;
10/// # use std::time::Duration;
11/// #
12/// # async fn handle(ctx: Context<'_>) -> Result<(), HandlerError> {
13/// # let (_, awakeable) = ctx.awakeable::<String>();
14/// # let (_, call_result) = ctx.awakeable::<String>();
15/// restate_sdk::select! {
16///     // Bind res to the awakeable result
17///     res = awakeable => {
18///         // Handle awakeable result
19///     },
20///     _ = ctx.sleep(Duration::from_secs(10)) => {
21///         // Handle sleep
22///     },
23///     // You can also pattern match
24///     Ok(success_result) = call_result => {
25///         // Handle success result
26///     },
27///     else => {
28///         // Optional: handle cases when pattern matching doesn't match a future result
29///         // If unspecified, select panics when there is no match, e.g. in the above select arm,
30///         // if call_result returns Err, it would panic unless you specify an else arm.
31///     },
32///     on_cancel => {
33///         // Optional: handle when the invocation gets cancelled during this select.
34///         // If unspecified, it just propagates the TerminalError
35///     }
36/// }
37/// #    Ok(())
38/// # }
39/// ```
40///
41/// Note: This API is experimental and subject to changes.
42#[macro_export]
43macro_rules! select {
44    // The macro is structured as a tt-muncher. All branches are processed and
45    // normalized. Once the input is normalized, it is passed to the top-most
46    // rule. When entering the macro, `@{ }` is inserted at the front. This is
47    // used to collect the normalized input.
48    //
49    // The macro only recurses once per branch. This allows using `select!`
50    // without requiring the user to increase the recursion limit.
51
52    // All input is normalized, now transform.
53    (@ {
54        // One `_` for each branch in the `select!` macro. Passing this to
55        // `count!` converts $skip to an integer.
56        ( $($count:tt)* )
57
58        // Normalized select branches. `( $skip )` is a set of `_` characters.
59        // There is one `_` for each select branch **before** this one. Given
60        // that all input futures are stored in a tuple, $skip is useful for
61        // generating a pattern to reference the future for the current branch.
62        // $skip is also used as an argument to `count!`, returning the index of
63        // the current select branch.
64        $( ( $($skip:tt)* ) $bind:pat = $fut:expr => $handle:expr, )+
65
66        // Expression used to special handle cancellation when awaiting select
67        ; $on_cancel:expr
68
69        // Fallback expression used when all select branches have been disabled.
70        ; $else:expr
71    }) => {{
72        use $crate::context::DurableFuture;
73        use $crate::context::macro_support::SealedDurableFuture;
74
75        let futures_init = ($( $fut, )+);
76        let handles = vec![$(
77            $crate::count_field!(futures_init.$($skip)*).handle()
78        ,)+];
79        let select_fut = futures_init.0.inner_context().select(handles);
80
81        match select_fut.await {
82            $(
83                Ok($crate::count!( $($skip)* )) => {
84                    match $crate::count_field!(futures_init.$($skip)*).await {
85                        $bind => {
86                            $handle
87                        }
88                        _ => {
89                            $else
90                        }
91                    }
92                }
93            )*
94            Ok(_) => {
95                unreachable!("Select fut returned index out of bounds")
96            }
97            Err(_) => {
98                $on_cancel
99            }
100            _ => unreachable!("reaching this means there probably is an off by one bug"),
101        }
102    }};
103
104    // ==== Normalize =====
105
106    // These rules match a single `select!` branch and normalize it for
107    // processing by the first rule.
108
109    (@ { $($t:tt)* } ) => {
110        // No `else` branch
111        $crate::select!(@{ $($t)*; { Err(TerminalError::new_with_code(409, "cancelled"))? }; panic!("No else branch is defined")})
112    };
113    (@ { $($t:tt)* } on_cancel => $on_cancel:expr $(,)?) => {
114        // on_cancel branch
115        $crate::select!(@{ $($t)*; $on_cancel; panic!("No else branch is defined") })
116    };
117    (@ { $($t:tt)* } else => $else:expr $(,)?) => {
118        // on_cancel branch
119        $crate::select!(@{ $($t)*; { Err(TerminalError::new_with_code(409, "cancelled"))? }; $else })
120    };
121    (@ { $($t:tt)* } on_cancel => $on_cancel:expr, else => $else:expr $(,)?) => {
122        // on_cancel branch
123        $crate::select!(@{ $($t)*; $on_cancel; $else })
124    };
125    (@ { $($t:tt)* } else => $else:expr, on_cancel => $on_cancel:expr $(,)?) => {
126        // on_cancel branch
127        $crate::select!(@{ $($t)*; $on_cancel; $else })
128    };
129    (@ { ( $($s:tt)* ) $($t:tt)* } $p:pat = $f:expr => $h:block, $($r:tt)* ) => {
130        $crate::select!(@{ ($($s)* _) $($t)* ($($s)*) $p = $f => $h, } $($r)*)
131    };
132    (@ { ( $($s:tt)* ) $($t:tt)* } $p:pat = $f:expr => $h:expr, $($r:tt)* ) => {
133        $crate::select!(@{ ($($s)* _) $($t)* ($($s)*) $p = $f => $h, } $($r)*)
134    };
135    (@ { ( $($s:tt)* ) $($t:tt)* } $p:pat = $f:expr => $h:block ) => {
136        $crate::select!(@{ ($($s)* _) $($t)* ($($s)*) $p = $f => $h, })
137    };
138    (@ { ( $($s:tt)* ) $($t:tt)* } $p:pat = $f:expr => $h:expr ) => {
139        $crate::select!(@{ ($($s)* _) $($t)* ($($s)*) $p = $f => $h, })
140    };
141
142    // ===== Entry point =====
143
144    (on_cancel => $on_cancel:expr $(,)? ) => {{
145         compile_error!("select! cannot contain only on_cancel branch.")
146    }};
147    (else => $else:expr $(,)? ) => {{
148         compile_error!("select! cannot contain only else branch.")
149    }};
150
151    ( $p:pat = $($t:tt)* ) => {
152        $crate::select!(@{ () } $p = $($t)*)
153    };
154
155    () => {
156        compile_error!("select! requires at least one branch.")
157    };
158}
159
160// And here... we manually list out matches for up to 64 branches... I'm not
161// happy about it either, but this is how we manage to use a declarative macro!
162
163#[macro_export]
164#[doc(hidden)]
165macro_rules! count {
166    () => {
167        0
168    };
169    (_) => {
170        1
171    };
172    (_ _) => {
173        2
174    };
175    (_ _ _) => {
176        3
177    };
178    (_ _ _ _) => {
179        4
180    };
181    (_ _ _ _ _) => {
182        5
183    };
184    (_ _ _ _ _ _) => {
185        6
186    };
187    (_ _ _ _ _ _ _) => {
188        7
189    };
190    (_ _ _ _ _ _ _ _) => {
191        8
192    };
193    (_ _ _ _ _ _ _ _ _) => {
194        9
195    };
196    (_ _ _ _ _ _ _ _ _ _) => {
197        10
198    };
199    (_ _ _ _ _ _ _ _ _ _ _) => {
200        11
201    };
202    (_ _ _ _ _ _ _ _ _ _ _ _) => {
203        12
204    };
205    (_ _ _ _ _ _ _ _ _ _ _ _ _) => {
206        13
207    };
208    (_ _ _ _ _ _ _ _ _ _ _ _ _ _) => {
209        14
210    };
211    (_ _ _ _ _ _ _ _ _ _ _ _ _ _ _) => {
212        15
213    };
214    (_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _) => {
215        16
216    };
217    (_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _) => {
218        17
219    };
220    (_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _) => {
221        18
222    };
223    (_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _) => {
224        19
225    };
226    (_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _) => {
227        20
228    };
229    (_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _) => {
230        21
231    };
232    (_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _) => {
233        22
234    };
235    (_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _) => {
236        23
237    };
238    (_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _) => {
239        24
240    };
241    (_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _) => {
242        25
243    };
244    (_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _) => {
245        26
246    };
247    (_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _) => {
248        27
249    };
250    (_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _) => {
251        28
252    };
253    (_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _) => {
254        29
255    };
256    (_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _) => {
257        30
258    };
259    (_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _) => {
260        31
261    };
262    (_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _) => {
263        32
264    };
265    (_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _) => {
266        33
267    };
268    (_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _) => {
269        34
270    };
271    (_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _) => {
272        35
273    };
274    (_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _) => {
275        36
276    };
277    (_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _) => {
278        37
279    };
280    (_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _) => {
281        38
282    };
283    (_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _) => {
284        39
285    };
286    (_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _) => {
287        40
288    };
289    (_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _) => {
290        41
291    };
292    (_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _) => {
293        42
294    };
295    (_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _) => {
296        43
297    };
298    (_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _) => {
299        44
300    };
301    (_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _) => {
302        45
303    };
304    (_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _) => {
305        46
306    };
307    (_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _) => {
308        47
309    };
310    (_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _) => {
311        48
312    };
313    (_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _) => {
314        49
315    };
316    (_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _) => {
317        50
318    };
319    (_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _) => {
320        51
321    };
322    (_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _) => {
323        52
324    };
325    (_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _) => {
326        53
327    };
328    (_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _) => {
329        54
330    };
331    (_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _) => {
332        55
333    };
334    (_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _) => {
335        56
336    };
337    (_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _) => {
338        57
339    };
340    (_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _) => {
341        58
342    };
343    (_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _) => {
344        59
345    };
346    (_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _) => {
347        60
348    };
349    (_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _) => {
350        61
351    };
352    (_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _) => {
353        62
354    };
355    (_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _) => {
356        63
357    };
358    (_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _) => {
359        64
360    };
361}
362
363#[macro_export]
364#[doc(hidden)]
365macro_rules! count_field {
366    ($var:ident. ) => {
367        $var.0
368    };
369    ($var:ident. _) => {
370        $var.1
371    };
372    ($var:ident. _ _) => {
373        $var.2
374    };
375    ($var:ident. _ _ _) => {
376        $var.3
377    };
378    ($var:ident. _ _ _ _) => {
379        $var.4
380    };
381    ($var:ident. _ _ _ _ _) => {
382        $var.5
383    };
384    ($var:ident. _ _ _ _ _ _) => {
385        $var.6
386    };
387    ($var:ident. _ _ _ _ _ _ _) => {
388        $var.7
389    };
390    ($var:ident. _ _ _ _ _ _ _ _) => {
391        $var.8
392    };
393    ($var:ident. _ _ _ _ _ _ _ _ _) => {
394        $var.9
395    };
396    ($var:ident. _ _ _ _ _ _ _ _ _ _) => {
397        $var.10
398    };
399    ($var:ident. _ _ _ _ _ _ _ _ _ _ _) => {
400        $var.11
401    };
402    ($var:ident. _ _ _ _ _ _ _ _ _ _ _ _) => {
403        $var.12
404    };
405    ($var:ident. _ _ _ _ _ _ _ _ _ _ _ _ _) => {
406        $var.13
407    };
408    ($var:ident. _ _ _ _ _ _ _ _ _ _ _ _ _ _) => {
409        $var.14
410    };
411    ($var:ident. _ _ _ _ _ _ _ _ _ _ _ _ _ _ _) => {
412        $var.15
413    };
414    ($var:ident. _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _) => {
415        $var.16
416    };
417    ($var:ident. _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _) => {
418        $var.17
419    };
420    ($var:ident. _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _) => {
421        $var.18
422    };
423    ($var:ident. _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _) => {
424        $var.19
425    };
426    ($var:ident. _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _) => {
427        $var.20
428    };
429    ($var:ident. _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _) => {
430        $var.21
431    };
432    ($var:ident. _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _) => {
433        $var.22
434    };
435    ($var:ident. _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _) => {
436        $var.23
437    };
438    ($var:ident. _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _) => {
439        $var.24
440    };
441    ($var:ident. _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _) => {
442        $var.25
443    };
444    ($var:ident. _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _) => {
445        $var.26
446    };
447    ($var:ident. _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _) => {
448        $var.27
449    };
450    ($var:ident. _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _) => {
451        $var.28
452    };
453    ($var:ident. _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _) => {
454        $var.29
455    };
456    ($var:ident. _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _) => {
457        $var.30
458    };
459    ($var:ident. _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _) => {
460        $var.31
461    };
462    ($var:ident. _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _) => {
463        $var.32
464    };
465    ($var:ident. _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _) => {
466        $var.33
467    };
468    ($var:ident. _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _) => {
469        $var.34
470    };
471    ($var:ident. _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _) => {
472        $var.35
473    };
474    ($var:ident. _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _) => {
475        $var.36
476    };
477    ($var:ident. _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _) => {
478        $var.37
479    };
480    ($var:ident. _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _) => {
481        $var.38
482    };
483    ($var:ident. _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _) => {
484        $var.39
485    };
486    ($var:ident. _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _) => {
487        $var.40
488    };
489    ($var:ident. _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _) => {
490        $var.41
491    };
492    ($var:ident. _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _) => {
493        $var.42
494    };
495    ($var:ident. _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _) => {
496        $var.43
497    };
498    ($var:ident. _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _) => {
499        $var.44
500    };
501    ($var:ident. _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _) => {
502        $var.45
503    };
504    ($var:ident. _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _) => {
505        $var.46
506    };
507    ($var:ident. _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _) => {
508        $var.47
509    };
510    ($var:ident. _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _) => {
511        $var.48
512    };
513    ($var:ident. _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _) => {
514        $var.49
515    };
516    ($var:ident. _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _) => {
517        $var.50
518    };
519    ($var:ident. _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _) => {
520        $var.51
521    };
522    ($var:ident. _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _) => {
523        $var.52
524    };
525    ($var:ident. _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _) => {
526        $var.53
527    };
528    ($var:ident. _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _) => {
529        $var.54
530    };
531    ($var:ident. _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _) => {
532        $var.55
533    };
534    ($var:ident. _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _) => {
535        $var.56
536    };
537    ($var:ident. _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _) => {
538        $var.57
539    };
540    ($var:ident. _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _) => {
541        $var.58
542    };
543    ($var:ident. _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _) => {
544        $var.59
545    };
546    ($var:ident. _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _) => {
547        $var.60
548    };
549    ($var:ident. _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _) => {
550        $var.61
551    };
552    ($var:ident. _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _) => {
553        $var.62
554    };
555    ($var:ident. _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _) => {
556        $var.63
557    };
558    ($var:ident. _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _) => {
559        $var.64
560    };
561}