dfir_lang/graph/ops/
unzip.rs

1use quote::quote_spanned;
2use syn::parse_quote;
3
4use super::{
5    OperatorCategory, OperatorConstraints, OperatorWriteOutput, WriteContextArgs,
6    RANGE_0, RANGE_1,
7};
8
9/// > 1 input stream of pair tuples `(A, B)`, 2 output streams
10///
11/// Takes the input stream of pairs and unzips each one, delivers each item to
12/// its corresponding side.
13///
14/// ```dfir
15/// my_unzip = source_iter(vec![("Hello", "Foo"), ("World", "Bar")]) -> unzip();
16/// my_unzip[0] -> assert_eq(["Hello", "World"]);
17/// my_unzip[1] -> assert_eq(["Foo", "Bar"]);
18/// ```
19pub const UNZIP: OperatorConstraints = OperatorConstraints {
20    name: "unzip",
21    categories: &[OperatorCategory::MultiOut],
22    hard_range_inn: RANGE_1,
23    soft_range_inn: RANGE_1,
24    hard_range_out: &(2..=2),
25    soft_range_out: &(2..=2),
26    num_args: 0,
27    persistence_args: RANGE_0,
28    type_args: RANGE_0,
29    is_external_input: false,
30    has_singleton_output: false,
31    flo_type: None,
32    ports_inn: None,
33    ports_out: Some(|| super::PortListSpec::Fixed(parse_quote!(0, 1))),
34    input_delaytype_fn: |_| None,
35    write_fn: |&WriteContextArgs {
36                   root,
37                   op_span,
38                   ident,
39                   outputs,
40                   is_pull,
41                   ..
42               },
43               _| {
44        assert!(!is_pull);
45        let output0 = &outputs[0];
46        let output1 = &outputs[1];
47        let write_iterator = quote_spanned! {op_span=>
48            let #ident = #root::pusherator::unzip::Unzip::new(#output0, #output1);
49        };
50        Ok(OperatorWriteOutput {
51            write_iterator,
52            ..Default::default()
53        })
54    },
55};