dfir_lang/graph/ops/
join_fused_rhs.rs
1use quote::{ToTokens, quote_spanned};
2use syn::parse_quote;
3
4use super::{
5 DelayType, OperatorCategory, OperatorConstraints, OperatorWriteOutput, PortIndexValue, RANGE_0,
6 RANGE_1, WriteContextArgs,
7};
8
9pub const JOIN_FUSED_RHS: OperatorConstraints = OperatorConstraints {
13 name: "join_fused_rhs",
14 categories: &[OperatorCategory::MultiIn],
15 hard_range_inn: &(2..=2),
16 soft_range_inn: &(2..=2),
17 hard_range_out: RANGE_1,
18 soft_range_out: RANGE_1,
19 num_args: 1,
20 persistence_args: &(0..=2),
21 type_args: RANGE_0,
22 is_external_input: false,
23 has_singleton_output: false,
24 flo_type: None,
25 ports_inn: Some(|| super::PortListSpec::Fixed(parse_quote! { 0, 1 })),
26 ports_out: None,
27 input_delaytype_fn: |idx| match idx {
28 PortIndexValue::Int(path) if "1" == path.to_token_stream().to_string() => {
29 Some(DelayType::Stratum)
30 }
31 _ => None,
32 },
33 write_fn: |wc @ &WriteContextArgs {
34 op_span,
35 ident,
36 inputs,
37 ..
38 },
39 diagnostics| {
40 let inputs = inputs.iter().cloned().rev().collect::<Vec<_>>();
41
42 let wc = WriteContextArgs {
43 inputs: &inputs[..],
44 ..wc.clone()
45 };
46
47 let OperatorWriteOutput {
48 write_prologue,
49 write_prologue_after,
50 write_iterator,
51 write_iterator_after,
52 } = (super::join_fused_lhs::JOIN_FUSED_LHS.write_fn)(&wc, diagnostics)?;
53
54 let write_iterator = quote_spanned! {op_span=>
55 #write_iterator
56 let #ident = #ident.map(|(k, (v1, v2))| (k, (v2, v1)));
57 };
58
59 Ok(OperatorWriteOutput {
60 write_prologue,
61 write_prologue_after,
62 write_iterator,
63 write_iterator_after,
64 })
65 },
66};