use melodium_core::*;
use melodium_macro::{check, mel_function, mel_treatment};
#[mel_function]
pub fn pow(base: f64, exponent: f64) -> f64 {
base.powf(exponent)
}
#[mel_function]
pub fn cbrt(value: f64) -> f64 {
value.cbrt()
}
#[mel_function]
pub fn ln(value: f64) -> f64 {
value.ln()
}
#[mel_function]
pub fn log(value: f64, base: f64) -> f64 {
value.log(base)
}
#[mel_function]
pub fn sqrt(value: f64) -> f64 {
value.sqrt()
}
#[mel_function]
pub fn acos(value: f64) -> f64 {
value.acos()
}
#[mel_function]
pub fn acosh(value: f64) -> f64 {
value.acosh()
}
#[mel_function]
pub fn asin(value: f64) -> f64 {
value.asin()
}
#[mel_function]
pub fn asinh(value: f64) -> f64 {
value.asinh()
}
#[mel_function]
pub fn atan(value: f64) -> f64 {
value.atan()
}
#[mel_function]
pub fn atanh(value: f64) -> f64 {
value.atanh()
}
#[mel_function]
pub fn cos(value: f64) -> f64 {
value.cos()
}
#[mel_function]
pub fn cosh(value: f64) -> f64 {
value.cosh()
}
#[mel_function]
pub fn sin(value: f64) -> f64 {
value.sin()
}
#[mel_function]
pub fn sinh(value: f64) -> f64 {
value.sinh()
}
#[mel_function]
pub fn tan(value: f64) -> f64 {
value.tan()
}
#[mel_function]
pub fn tanh(value: f64) -> f64 {
value.tanh()
}
#[mel_treatment(
input base Stream<f64>
input exponent Stream<f64>
output power Stream<f64>
)]
pub async fn pow() {
while let (Ok(base), Ok(exp)) = (base.recv_one_f64().await, exponent.recv_one_f64().await) {
check!(power.send_one_f64(base.powf(exp)).await)
}
}
#[mel_treatment(
input value Stream<f64>
output root Stream<f64>
)]
pub async fn cbrt() {
while let Ok(values) = value.recv_f64().await {
check!(
root.send_f64(values.into_iter().map(|v| v.cbrt()).collect())
.await
)
}
}
#[mel_treatment(
input value Stream<f64>
output log Stream<f64>
)]
pub async fn ln() {
while let Ok(values) = value.recv_f64().await {
check!(
log.send_f64(values.into_iter().map(|v| v.ln()).collect())
.await
)
}
}
#[mel_treatment(
input base Stream<f64>
input value Stream<f64>
output log Stream<f64>
)]
pub async fn log() {
while let (Ok(base), Ok(value)) = (base.recv_one_f64().await, value.recv_one_f64().await) {
check!(log.send_one_f64(value.log(base)).await)
}
}
#[mel_treatment(
input value Stream<f64>
output root Stream<f64>
)]
pub async fn sqrt() {
while let Ok(values) = value.recv_f64().await {
check!(
root.send_f64(values.into_iter().map(|v| v.sqrt()).collect())
.await
)
}
}
#[mel_treatment(
input value Stream<f64>
output acos Stream<f64>
)]
pub async fn acos() {
while let Ok(values) = value.recv_f64().await {
check!(
acos.send_f64(values.into_iter().map(|v| v.acos()).collect())
.await
)
}
}
#[mel_treatment(
input value Stream<f64>
output acosh Stream<f64>
)]
pub async fn acosh() {
while let Ok(values) = value.recv_f64().await {
check!(
acosh
.send_f64(values.into_iter().map(|v| v.acosh()).collect())
.await
)
}
}
#[mel_treatment(
input value Stream<f64>
output asin Stream<f64>
)]
pub async fn asin() {
while let Ok(values) = value.recv_f64().await {
check!(
asin.send_f64(values.into_iter().map(|v| v.asin()).collect())
.await
)
}
}
#[mel_treatment(
input value Stream<f64>
output asinh Stream<f64>
)]
pub async fn asinh() {
while let Ok(values) = value.recv_f64().await {
check!(
asinh
.send_f64(values.into_iter().map(|v| v.asinh()).collect())
.await
)
}
}
#[mel_treatment(
input value Stream<f64>
output atan Stream<f64>
)]
pub async fn atan() {
while let Ok(values) = value.recv_f64().await {
check!(
atan.send_f64(values.into_iter().map(|v| v.atan()).collect())
.await
)
}
}
#[mel_treatment(
input value Stream<f64>
output atanh Stream<f64>
)]
pub async fn atanh() {
while let Ok(values) = value.recv_f64().await {
check!(
atanh
.send_f64(values.into_iter().map(|v| v.atanh()).collect())
.await
)
}
}
#[mel_treatment(
input value Stream<f64>
output cos Stream<f64>
)]
pub async fn cos() {
while let Ok(values) = value.recv_f64().await {
check!(
cos.send_f64(values.into_iter().map(|v| v.cos()).collect())
.await
)
}
}
#[mel_treatment(
input value Stream<f64>
output cosh Stream<f64>
)]
pub async fn cosh() {
while let Ok(values) = value.recv_f64().await {
check!(
cosh.send_f64(values.into_iter().map(|v| v.cosh()).collect())
.await
)
}
}
#[mel_treatment(
input value Stream<f64>
output sin Stream<f64>
)]
pub async fn sin() {
while let Ok(values) = value.recv_f64().await {
check!(
sin.send_f64(values.into_iter().map(|v| v.sin()).collect())
.await
)
}
}
#[mel_treatment(
input value Stream<f64>
output sinh Stream<f64>
)]
pub async fn sinh() {
while let Ok(values) = value.recv_f64().await {
check!(
sinh.send_f64(values.into_iter().map(|v| v.sinh()).collect())
.await
)
}
}
#[mel_treatment(
input value Stream<f64>
output tan Stream<f64>
)]
pub async fn tan() {
while let Ok(values) = value.recv_f64().await {
check!(
tan.send_f64(values.into_iter().map(|v| v.tan()).collect())
.await
)
}
}
#[mel_treatment(
input value Stream<f64>
output tanh Stream<f64>
)]
pub async fn tanh() {
while let Ok(values) = value.recv_f64().await {
check!(
tanh.send_f64(values.into_iter().map(|v| v.tanh()).collect())
.await
)
}
}
#[mel_function]
pub fn add(a: f64, b: f64) -> f64 {
a + b
}
#[mel_function]
pub fn div(dividend: f64, divisor: f64) -> f64 {
dividend / divisor
}
#[mel_function]
pub fn mult(a: f64, b: f64) -> f64 {
a * b
}
#[mel_function]
pub fn rem(dividend: f64, divisor: f64) -> f64 {
dividend % divisor
}
#[mel_function]
pub fn sub(a: f64, b: f64) -> f64 {
a - b
}
#[mel_function]
pub fn gt(a: f64, b: f64) -> bool {
a > b
}
#[mel_function]
pub fn lt(a: f64, b: f64) -> bool {
a < b
}
#[mel_function]
pub fn min(a: f64, b: f64) -> f64 {
a.min(b)
}
#[mel_function]
pub fn max(a: f64, b: f64) -> f64 {
a.max(b)
}
#[mel_treatment(
input a Stream<f64>
input b Stream<f64>
output sum Stream<f64>
)]
pub async fn add() {
while let (Ok(a), Ok(b)) = (a.recv_one_f64().await, b.recv_one_f64().await) {
check!(sum.send_one_f64(a + b).await)
}
}
#[mel_treatment(
input a Stream<f64>
input b Stream<f64>
output quotient Stream<f64>
)]
pub async fn div() {
while let (Ok(a), Ok(b)) = (a.recv_one_f64().await, b.recv_one_f64().await) {
check!(quotient.send_one_f64(a / b).await)
}
}
#[mel_treatment(
input a Stream<f64>
input b Stream<f64>
output product Stream<f64>
)]
pub async fn mult() {
while let (Ok(a), Ok(b)) = (a.recv_one_f64().await, b.recv_one_f64().await) {
check!(product.send_one_f64(a * b).await)
}
}
#[mel_treatment(
input a Stream<f64>
input b Stream<f64>
output remainder Stream<f64>
)]
pub async fn rem() {
while let (Ok(a), Ok(b)) = (a.recv_one_f64().await, b.recv_one_f64().await) {
check!(remainder.send_one_f64(a % b).await)
}
}
#[mel_treatment(
input a Stream<f64>
input b Stream<f64>
output diff Stream<f64>
)]
pub async fn sub() {
while let (Ok(a), Ok(b)) = (a.recv_one_f64().await, b.recv_one_f64().await) {
check!(diff.send_one_f64(a - b).await)
}
}
#[mel_treatment(
input a Stream<f64>
input b Stream<f64>
output min Stream<f64>
)]
pub async fn min() {
while let (Ok(a), Ok(b)) = (a.recv_one_f64().await, b.recv_one_f64().await) {
check!(min.send_one_f64(a.min(b)).await)
}
}
#[mel_treatment(
input a Stream<f64>
input b Stream<f64>
output max Stream<f64>
)]
pub async fn max() {
while let (Ok(a), Ok(b)) = (a.recv_one_f64().await, b.recv_one_f64().await) {
check!(max.send_one_f64(a.max(b)).await)
}
}
#[mel_treatment(
input a Stream<f64>
input b Stream<f64>
output is Stream<bool>
)]
pub async fn lower_than() {
while let (Ok(a), Ok(b)) = (a.recv_one_f64().await, b.recv_one_f64().await) {
check!(is.send_one_bool(a < b).await)
}
}
#[mel_treatment(
input a Stream<f64>
input b Stream<f64>
output is Stream<bool>
)]
pub async fn greater_than() {
while let (Ok(a), Ok(b)) = (a.recv_one_f64().await, b.recv_one_f64().await) {
check!(is.send_one_bool(a > b).await)
}
}
#[mel_function]
pub fn abs(value: f64) -> f64 {
value.abs()
}
#[mel_treatment(
input value Stream<f64>
output abs Stream<f64>
)]
pub async fn abs() {
while let Ok(values) = value.recv_f64().await {
check!(
abs.send_f64(values.into_iter().map(|v| v.abs()).collect())
.await
)
}
}