dfir_lang/graph/ops/
next_iteration.rs
1use quote::quote_spanned;
2
3use super::{
4 FloType, OperatorCategory, OperatorConstraints, OperatorWriteOutput, WriteContextArgs, RANGE_0,
5 RANGE_1,
6};
7
8pub const NEXT_ITERATION: OperatorConstraints = OperatorConstraints {
10 name: "next_iteration",
11 categories: &[OperatorCategory::Control],
12 hard_range_inn: RANGE_1,
13 soft_range_inn: RANGE_1,
14 hard_range_out: RANGE_1,
15 soft_range_out: RANGE_1,
16 num_args: 0,
17 persistence_args: RANGE_0,
18 type_args: RANGE_0,
19 is_external_input: false,
20 has_singleton_output: false,
21 flo_type: Some(FloType::NextIteration),
22 ports_inn: None,
23 ports_out: None,
24 input_delaytype_fn: |_| None,
25 write_fn: |&WriteContextArgs {
26 context,
27 ident,
28 is_pull,
29 inputs,
30 op_span,
31 ..
32 },
33 _diagnostics| {
34 assert!(is_pull);
35
36 let input = &inputs[0];
37 let write_iterator = quote_spanned! {op_span=>
38 let #ident = ::std::iter::Iterator::filter(#input, |_| 0 != #context.loop_iter_count());
40 };
41
42 Ok(OperatorWriteOutput {
43 write_iterator,
44 ..Default::default()
45 })
46 },
47};