Compare commits

...

3 commits

8 changed files with 49 additions and 100 deletions

View file

@ -2,7 +2,8 @@
members = [
"crates/app",
"crates/eval",
"crates/ir", "crates/prowocessing",
"crates/ir",
"crates/prowocessing",
]
resolver = "2"

View file

@ -27,7 +27,7 @@ enum Commands {
},
Dev {
#[command(subcommand)]
dev_command: DevCommands,
command: DevCommands,
},
}
@ -50,7 +50,9 @@ fn main() {
machine.feed(ir);
machine.eval_full();
}
Commands::Dev { dev_command } => dev_command.run(),
Commands::Dev {
command: dev_command,
} => dev_command.run(),
}
}
@ -85,7 +87,8 @@ mod dev {
let pipe = PipelineBuilder::new().add(1).stringify().build();
println!(
"{:?}",
pipe.run(vec![num0.into(), num1.into()].into()).into_inner()[0]
pipe.run(vec![&num0.into(), &num1.into()].into())
.into_inner()[0]
);
}
}

View file

@ -37,7 +37,7 @@ impl Available {
#[must_use]
pub fn pick(&self) -> Box<dyn Evaluator> {
match self {
Self::Debug => Box::new(kind::debug::Evaluator::default()),
Self::Debug => Box::<kind::debug::Evaluator>::default(),
}
}
}

View file

@ -1,7 +1,5 @@
//! Definitions of the data transfer and storage types.
/// Types for element and pipeline IO
pub mod io;
/// Raw data types contained in `io`
pub mod raw;

View file

@ -1,22 +1,19 @@
use super::raw::{Data, OwnedData};
//! Types for element and pipeline IO
use std::{borrow::ToOwned, convert::Into};
use super::raw::Data;
/// Newtype struct with borrowed types for pipeline/element inputs, so that doesn't force a move or clone
pub struct Inputs<'a>(Vec<Data<'a>>);
pub struct Inputs<'a>(pub Vec<&'a Data>);
impl<'a> Inputs<'a> {
/// get inner value(s)
pub(crate) fn inner(&self) -> Vec<Data<'a>> {
self.0.clone()
}
}
impl<'a> From<Vec<Data<'a>>> for Inputs<'a> {
fn from(value: Vec<Data<'a>>) -> Self {
impl<'a> From<Vec<&'a Data>> for Inputs<'a> {
fn from(value: Vec<&'a Data>) -> Self {
Self(value)
}
}
impl<'a, T: Into<Data<'a>>> From<T> for Inputs<'a> {
impl<'a, T: Into<&'a Data>> From<T> for Inputs<'a> {
fn from(value: T) -> Self {
Self(vec![value.into()])
}
@ -24,37 +21,31 @@ impl<'a, T: Into<Data<'a>>> From<T> for Inputs<'a> {
impl<'a> From<&'a Outputs> for Inputs<'a> {
fn from(value: &'a Outputs) -> Self {
Self(value.0.iter().map(std::convert::Into::into).collect())
Self(value.0.iter().map(Into::into).collect())
}
}
/// Newtype struct around `OwnedData` for pipeline/element outputs
pub struct Outputs(Vec<OwnedData>);
/// Used for pipeline/element outputs
pub struct Outputs(Vec<Data>);
impl Outputs {
/// consume self and return inner value(s)
pub fn into_inner(self) -> Vec<OwnedData> {
pub fn into_inner(self) -> Vec<Data> {
self.0
}
}
impl From<Vec<OwnedData>> for Outputs {
fn from(value: Vec<OwnedData>) -> Self {
impl From<Vec<Data>> for Outputs {
fn from(value: Vec<Data>) -> Self {
Self(value)
}
}
impl<T: Into<OwnedData>> From<T> for Outputs {
impl<T: Into<Data>> From<T> for Outputs {
fn from(value: T) -> Self {
Self(vec![value.into()])
}
}
impl From<Inputs<'_>> for Outputs {
fn from(value: Inputs) -> Self {
Self(
value
.0
.into_iter()
.map(|i: Data<'_>| Data::to_owned_data(&i))
.collect(),
)
Self(value.0.into_iter().map(ToOwned::to_owned).collect())
}
}

View file

@ -1,58 +1,20 @@
//! Dynamic data storage and transfer types
//! Dynamic data storage and transfer types for use in [`io`]
/// Owned data type, for use mostly in outputs and storage
// Dynamic data type
#[derive(Clone, Debug)]
pub enum OwnedData {
pub enum Data {
String(String),
Int(i32),
}
impl From<String> for OwnedData {
impl From<String> for Data {
fn from(value: String) -> Self {
Self::String(value)
}
}
impl From<i32> for OwnedData {
impl From<i32> for Data {
fn from(value: i32) -> Self {
Self::Int(value)
}
}
/// Unowned data type, for inputs into runner functions
#[derive(Clone, Copy)]
pub enum Data<'a> {
String(&'a str),
Int(i32),
}
impl Data<'_> {
/// converts itself to `OwnedData`
pub fn to_owned_data(&self) -> OwnedData {
match self {
Data::String(s) => (*s).to_owned().into(),
Data::Int(i) => (*i).into(),
}
}
}
impl<'a> From<&'a str> for Data<'a> {
fn from(value: &'a str) -> Self {
Self::String(value)
}
}
impl From<i32> for Data<'_> {
fn from(value: i32) -> Self {
Self::Int(value)
}
}
impl<'a> From<&'a OwnedData> for Data<'a> {
fn from(value: &'a OwnedData) -> Self {
match value {
OwnedData::String(s) => Data::String(s),
OwnedData::Int(i) => Data::Int(*i),
}
}
}

View file

@ -14,11 +14,10 @@ pub struct Add(pub i32);
impl PipelineElement for Add {
fn runner(&self) -> fn(&Inputs) -> Outputs {
|input| {
if let [Data::Int(i0), Data::Int(i1), ..] = input.inner()[..] {
(i0 + i1).into()
} else {
let [Data::Int(i0), Data::Int(i1), ..] = input.0[..] else {
panic!("Invalid data passed")
}
};
(i0 + i1).into()
}
}
@ -35,11 +34,10 @@ pub struct Subtract(pub i32);
impl PipelineElement for Subtract {
fn runner(&self) -> fn(&Inputs) -> Outputs {
|input| {
if let [Data::Int(i0), Data::Int(i1), ..] = input.inner()[..] {
(i0 + i1).into()
} else {
let [Data::Int(i0), Data::Int(i1), ..] = input.0[..] else {
panic!("Invalid data passed")
}
};
(i0 + i1).into()
}
}
@ -56,11 +54,10 @@ pub struct Stringify;
impl PipelineElement for Stringify {
fn runner(&self) -> fn(&Inputs) -> Outputs {
|input| {
if let [Data::Int(int), ..] = input.inner()[..] {
int.to_string().into()
} else {
let [Data::Int(int), ..] = input.0[..] else {
panic!("Invalid data passed")
}
};
int.to_string().into()
}
}

View file

@ -12,11 +12,10 @@ pub struct Concatenate(pub String);
impl PipelineElement for Concatenate {
fn runner(&self) -> fn(&Inputs) -> Outputs {
|input| {
if let [Data::String(s0), Data::String(s1), ..] = input.inner()[..] {
format!("{s0}{s1}").into()
} else {
let [Data::String(s0), Data::String(s1), ..] = input.0[..] else {
panic!("Invalid data passed")
}
};
format!("{s0}{s1}").into()
}
}
@ -33,11 +32,10 @@ pub struct Upper;
impl PipelineElement for Upper {
fn runner(&self) -> fn(&Inputs) -> Outputs {
|input| {
if let [Data::String(s), ..] = input.inner()[..] {
s.to_uppercase().into()
} else {
let [Data::String(s), ..] = input.0[..] else {
panic!("Invalid data passed")
}
};
s.to_uppercase().into()
}
}
@ -54,11 +52,10 @@ pub struct Lower;
impl PipelineElement for Lower {
fn runner(&self) -> fn(&Inputs) -> Outputs {
|input| {
if let [Data::String(s), ..] = input.inner()[..] {
s.to_lowercase().into()
} else {
let [Data::String(s), ..] = input.0[..] else {
panic!("Invalid data passed")
}
};
s.to_lowercase().into()
}
}