//! Operations on numeric data use core::panic; use crate::experimental::trait_based::{ data::{ io::{Inputs, Outputs}, raw::DataRef, }, element::{DataType, ElementSignature, PipelineElement}, }; /// Addition pub struct Add(pub i32); impl PipelineElement for Add { fn runner(&self) -> fn(&Inputs) -> Outputs { |input| { let [DataRef::Int(i0), DataRef::Int(i1), ..] = input.inner()[..] else { panic!("Invalid data passed") }; (i0 + i1).into() } } fn signature(&self) -> ElementSignature { ElementSignature { inputs: vec![DataType::Int, DataType::Int], outputs: vec![DataType::Int], } } } /// Subtraction pub struct Subtract(pub i32); impl PipelineElement for Subtract { fn runner(&self) -> fn(&Inputs) -> Outputs { |input| { let [DataRef::Int(i0), DataRef::Int(i1), ..] = input.inner()[..] else { panic!("Invalid data passed") }; (i0 + i1).into() } } fn signature(&self) -> ElementSignature { ElementSignature { inputs: vec![DataType::Int, DataType::Int], outputs: vec![DataType::Int], } } } /// Turn input to string pub struct Stringify; impl PipelineElement for Stringify { fn runner(&self) -> fn(&Inputs) -> Outputs { |input| { let [DataRef::Int(int), ..] = input.inner()[..] else { panic!("Invalid data passed") }; int.to_string().into() } } fn signature(&self) -> ElementSignature { ElementSignature { inputs: vec![DataType::Int], outputs: vec![DataType::String], } } }