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