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
7/// > 0 input streams, 1 output stream
8///
9/// > Arguments: An iterable Rust object.
10///
11/// Takes the iterable object and delivers its elements downstream
12/// one by one.
13///
14/// Note that all elements are emitted during the first tick.
15///
16/// ```dfir
17///     source_iter(vec!["Hello", "World"])
18///         -> for_each(|x| println!("{}", x));
19/// ```
20pub 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};