dfir_lang/graph/ops/
difference.rs
1use quote::{ToTokens, quote_spanned};
2use syn::parse_quote;
3
4use super::{
5 DelayType, OperatorCategory, OperatorConstraints, OperatorInstance, OperatorWriteOutput,
6 PortIndexValue, RANGE_0, RANGE_1, WriteContextArgs,
7};
8
9pub const DIFFERENCE: OperatorConstraints = OperatorConstraints {
26 name: "difference",
27 categories: &[OperatorCategory::MultiIn],
28 hard_range_inn: &(2..=2),
29 soft_range_inn: &(2..=2),
30 hard_range_out: RANGE_1,
31 soft_range_out: RANGE_1,
32 num_args: 0,
33 persistence_args: &(0..=2),
34 type_args: RANGE_0,
35 is_external_input: false,
36 has_singleton_output: false,
37 flo_type: None,
38 ports_inn: Some(|| super::PortListSpec::Fixed(parse_quote! { pos, neg })),
39 ports_out: None,
40 input_delaytype_fn: |idx| match idx {
41 PortIndexValue::Path(path) if "neg" == path.to_token_stream().to_string() => {
42 Some(DelayType::Stratum)
43 }
44 _else => None,
45 },
46 write_fn: |wc @ &WriteContextArgs {
47 op_span,
48 ident,
49 inputs,
50 op_inst: OperatorInstance { .. },
51 ..
52 },
53 diagnostics| {
54 let OperatorWriteOutput {
55 write_prologue,
56 write_prologue_after,
57 write_iterator,
58 write_iterator_after,
59 } = (super::anti_join::ANTI_JOIN.write_fn)(wc, diagnostics)?;
60
61 let pos = &inputs[1];
62 let write_iterator = quote_spanned! {op_span=>
63 let #pos = #pos.map(|k| (k, ()));
64 #write_iterator
65 let #ident = #ident.map(|(k, ())| k);
66 };
67
68 Ok(OperatorWriteOutput {
69 write_prologue,
70 write_prologue_after,
71 write_iterator,
72 write_iterator_after,
73 })
74 },
75};