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
8// TODO(mingwei)
9pub 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            // Discard items from previous loop executions.
39            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};