dfir_lang/graph/ops/
source_iter.rs
1use quote::quote_spanned;
2
3use super::{
4 FloType, OperatorCategory, OperatorConstraints, OperatorWriteOutput, WriteContextArgs, RANGE_0, RANGE_1
5};
6
7pub const SOURCE_ITER: OperatorConstraints = OperatorConstraints {
21 name: "source_iter",
22 categories: &[OperatorCategory::Source],
23 hard_range_inn: RANGE_0,
24 soft_range_inn: RANGE_0,
25 hard_range_out: RANGE_1,
26 soft_range_out: RANGE_1,
27 num_args: 1,
28 persistence_args: RANGE_0,
29 type_args: RANGE_0,
30 is_external_input: false,
31 has_singleton_output: false,
32 flo_type: Some(FloType::Source),
33 ports_inn: None,
34 ports_out: None,
35 input_delaytype_fn: |_| None,
36 write_fn: |wc @ &WriteContextArgs {
37 op_span,
38 ident,
39 arguments,
40 ..
41 },
42 _| {
43 let iter = &arguments[0];
44 let iter_ident = wc.make_ident("iter");
45 let write_prologue = quote_spanned! {op_span=>
46 let mut #iter_ident = {
47 #[inline(always)]
48 fn check_iter<IntoIter: ::std::iter::IntoIterator<Item = Item>, Item>(into_iter: IntoIter) -> impl ::std::iter::Iterator<Item = Item> {
49 ::std::iter::IntoIterator::into_iter(into_iter)
50 }
51 check_iter(#iter)
52 };
53 };
54 let write_iterator = quote_spanned! {op_span=>
55 let #ident = #iter_ident.by_ref();
56 };
57 Ok(OperatorWriteOutput {
58 write_prologue,
59 write_iterator,
60 ..Default::default()
61 })
62 },
63};