use melodium_core::*;
use melodium_macro::{check, mel_function, mel_treatment};
#[mel_treatment(
default delimiter "\n"
input unscaled Stream<string>
output scaled Stream<string>
)]
pub async fn rescale(delimiter: string) {
let mut previous = String::new();
'main: while let Ok(input) = unscaled.recv_one_string().await {
let splits: Vec<&str> = input.split_inclusive(&delimiter).collect();
for split in splits {
previous.push_str(split);
if previous.ends_with(&delimiter) {
check!('main, scaled.send_one_string(previous).await);
previous = String::new();
}
}
}
}
#[mel_treatment(
default inclusive true
input text Stream<string>
output splitted Stream<Vec<string>>
)]
pub async fn split(delimiter: string, inclusive: bool) {
while let Ok(input) = text.recv_string().await {
let mut output = Vec::with_capacity(input.len());
if inclusive {
input.into_iter().for_each(|text| {
output.push(
text.split_inclusive(&delimiter)
.map(|s| s.to_string())
.collect(),
)
});
} else {
input.into_iter().for_each(|text| {
output.push(text.split(&delimiter).map(|s| s.to_string()).collect())
});
}
check!(splitted.send_vec_string(output).await);
}
}
#[mel_function(
default inclusive true
)]
pub fn split(text: string, delimiter: string, inclusive: bool) -> Vec<string> {
if inclusive {
text.split_inclusive(&delimiter)
.map(|s| s.to_string())
.collect()
} else {
text.split(&delimiter).map(|s| s.to_string()).collect()
}
}
#[mel_treatment(
input text Stream<string>
output trimmed Stream<string>
)]
pub async fn trim() {
while let Ok(mut text) = text.recv_string().await {
text.iter_mut().for_each(|t| *t = t.trim().to_string());
check!(trimmed.send_string(text).await);
}
}
#[mel_function]
pub fn trim(text: string) -> string {
text.trim().to_string()
}