use melodium_core::*;
use melodium_macro::{check, mel_function, mel_treatment};
#[mel_treatment(
input chars Stream<char>
output matches Stream<bool>
)]
pub async fn exact(reference: char) {
while let Ok(chars) = chars
.recv_many()
.await
.map(|values| TryInto::<Vec<char>>::try_into(values).unwrap())
{
check!(
matches
.send_many(
chars
.into_iter()
.map(|char| char == reference)
.collect::<VecDeque<_>>()
.into()
)
.await
);
}
}
#[mel_function]
pub fn exact(char: char, reference: char) -> bool {
char == reference
}
#[mel_treatment(
input chars Stream<char>
output is Stream<bool>
)]
pub async fn is_alphabetic() {
while let Ok(chars) = chars
.recv_many()
.await
.map(|values| TryInto::<Vec<char>>::try_into(values).unwrap())
{
check!(
is.send_many(
chars
.into_iter()
.map(|char| char.is_alphabetic())
.collect::<VecDeque<_>>()
.into()
)
.await
);
}
}
#[mel_function]
pub fn is_alphabetic(char: char) -> bool {
char.is_alphabetic()
}
#[mel_treatment(
input chars Stream<char>
output is Stream<bool>
)]
pub async fn is_alphanumeric() {
while let Ok(chars) = chars
.recv_many()
.await
.map(|values| TryInto::<Vec<char>>::try_into(values).unwrap())
{
check!(
is.send_many(
chars
.into_iter()
.map(|char| char.is_alphanumeric())
.collect::<VecDeque<_>>()
.into()
)
.await
);
}
}
#[mel_function]
pub fn is_alphanumeric(char: char) -> bool {
char.is_alphanumeric()
}
#[mel_treatment(
input chars Stream<char>
output is Stream<bool>
)]
pub async fn is_ascii() {
while let Ok(chars) = chars
.recv_many()
.await
.map(|values| TryInto::<Vec<char>>::try_into(values).unwrap())
{
check!(
is.send_many(
chars
.into_iter()
.map(|char| char.is_ascii())
.collect::<VecDeque<_>>()
.into()
)
.await
);
}
}
#[mel_function]
pub fn is_ascii(char: char) -> bool {
char.is_ascii()
}
#[mel_treatment(
input chars Stream<char>
output is Stream<bool>
)]
pub async fn is_control() {
while let Ok(chars) = chars
.recv_many()
.await
.map(|values| TryInto::<Vec<char>>::try_into(values).unwrap())
{
check!(
is.send_many(
chars
.into_iter()
.map(|char| char.is_control())
.collect::<VecDeque<_>>()
.into()
)
.await
);
}
}
#[mel_function]
pub fn is_control(char: char) -> bool {
char.is_control()
}
#[mel_treatment(
input chars Stream<char>
output is Stream<bool>
)]
pub async fn is_digit(base: u8) {
while let Ok(chars) = chars
.recv_many()
.await
.map(|values| TryInto::<Vec<char>>::try_into(values).unwrap())
{
if base <= 36 {
check!(
is.send_many(
chars
.into_iter()
.map(|char| char.is_digit(base as u32))
.collect::<VecDeque<_>>()
.into()
)
.await
);
} else {
check!(is.send_many(vec![false; chars.len()].into()).await);
}
}
}
#[mel_function]
pub fn is_digit(char: char, base: u8) -> bool {
if base <= 36 {
char.is_digit(base as u32)
} else {
false
}
}
#[mel_treatment(
input chars Stream<char>
output is Stream<bool>
)]
pub async fn is_lowercase() {
while let Ok(chars) = chars
.recv_many()
.await
.map(|values| TryInto::<Vec<char>>::try_into(values).unwrap())
{
check!(
is.send_many(
chars
.into_iter()
.map(|char| char.is_lowercase())
.collect::<VecDeque<_>>()
.into()
)
.await
);
}
}
#[mel_function]
pub fn is_lowercase(char: char) -> bool {
char.is_lowercase()
}
#[mel_treatment(
input chars Stream<char>
output is Stream<bool>
)]
pub async fn is_uppercase() {
while let Ok(chars) = chars
.recv_many()
.await
.map(|values| TryInto::<Vec<char>>::try_into(values).unwrap())
{
check!(
is.send_many(
chars
.into_iter()
.map(|char| char.is_uppercase())
.collect::<VecDeque<_>>()
.into()
)
.await
);
}
}
#[mel_function]
pub fn is_uppercase(char: char) -> bool {
char.is_uppercase()
}
#[mel_treatment(
input chars Stream<char>
output is Stream<bool>
)]
pub async fn is_whitespace() {
while let Ok(chars) = chars
.recv_many()
.await
.map(|values| TryInto::<Vec<char>>::try_into(values).unwrap())
{
check!(
is.send_many(
chars
.into_iter()
.map(|char| char.is_whitespace())
.collect::<VecDeque<_>>()
.into()
)
.await
);
}
}
#[mel_function]
pub fn is_whitespace(char: char) -> bool {
char.is_whitespace()
}