use melodium_core::*;
use melodium_macro::{check, mel_function, mel_treatment};
#[mel_function]
pub fn equal(a: i128, b: i128) -> bool {
a == b
}
#[mel_function]
pub fn not_equal(a: i128, b: i128) -> bool {
a != b
}
#[mel_treatment(
input a Stream<i128>
input b Stream<i128>
output result Stream<bool>
)]
pub async fn equal() {
while let (Ok(a), Ok(b)) = (a.recv_one_i128().await, b.recv_one_i128().await) {
check!(result.send_one_bool(a == b).await)
}
}
#[mel_treatment(
input a Stream<i128>
input b Stream<i128>
output result Stream<bool>
)]
pub async fn not_equal() {
while let (Ok(a), Ok(b)) = (a.recv_one_i128().await, b.recv_one_i128().await) {
check!(result.send_one_bool(a != b).await)
}
}
#[mel_function]
pub fn pow(base: i128, exponent: i128) -> i128 {
base.pow(exponent as u32)
}
#[mel_function]
pub fn ge(a: i128, b: i128) -> bool {
a >= b
}
#[mel_function]
pub fn le(a: i128, b: i128) -> bool {
a <= b
}
#[mel_treatment(
input base Stream<i128>
input exponent Stream<i128>
output power Stream<i128>
)]
pub async fn pow() {
while let (Ok(base), Ok(exp)) = (base.recv_one_i128().await, exponent.recv_one_i128().await) {
check!(power.send_one_i128(base.pow(exp as u32)).await)
}
}
#[mel_treatment(
input a Stream<i128>
input b Stream<i128>
output is Stream<bool>
)]
pub async fn lower_equal() {
while let (Ok(a), Ok(b)) = (a.recv_one_i128().await, b.recv_one_i128().await) {
check!(is.send_one_bool(a <= b).await)
}
}
#[mel_treatment(
input a Stream<i128>
input b Stream<i128>
output is Stream<bool>
)]
pub async fn greater_equal() {
while let (Ok(a), Ok(b)) = (a.recv_one_i128().await, b.recv_one_i128().await) {
check!(is.send_one_bool(a >= b).await)
}
}
#[mel_function]
pub fn add(a: i128, b: i128) -> i128 {
a + b
}
#[mel_function]
pub fn div(dividend: i128, divisor: i128) -> i128 {
dividend / divisor
}
#[mel_function]
pub fn mult(a: i128, b: i128) -> i128 {
a * b
}
#[mel_function]
pub fn rem(dividend: i128, divisor: i128) -> i128 {
dividend % divisor
}
#[mel_function]
pub fn sub(a: i128, b: i128) -> i128 {
a - b
}
#[mel_function]
pub fn gt(a: i128, b: i128) -> bool {
a > b
}
#[mel_function]
pub fn lt(a: i128, b: i128) -> bool {
a < b
}
#[mel_function]
pub fn min(a: i128, b: i128) -> i128 {
a.min(b)
}
#[mel_function]
pub fn max(a: i128, b: i128) -> i128 {
a.max(b)
}
#[mel_treatment(
input a Stream<i128>
input b Stream<i128>
output sum Stream<i128>
)]
pub async fn add() {
while let (Ok(a), Ok(b)) = (a.recv_one_i128().await, b.recv_one_i128().await) {
check!(sum.send_one_i128(a + b).await)
}
}
#[mel_treatment(
input a Stream<i128>
input b Stream<i128>
output quotient Stream<i128>
)]
pub async fn div() {
while let (Ok(a), Ok(b)) = (a.recv_one_i128().await, b.recv_one_i128().await) {
check!(quotient.send_one_i128(a / b).await)
}
}
#[mel_treatment(
input a Stream<i128>
input b Stream<i128>
output product Stream<i128>
)]
pub async fn mult() {
while let (Ok(a), Ok(b)) = (a.recv_one_i128().await, b.recv_one_i128().await) {
check!(product.send_one_i128(a * b).await)
}
}
#[mel_treatment(
input a Stream<i128>
input b Stream<i128>
output remainder Stream<i128>
)]
pub async fn rem() {
while let (Ok(a), Ok(b)) = (a.recv_one_i128().await, b.recv_one_i128().await) {
check!(remainder.send_one_i128(a % b).await)
}
}
#[mel_treatment(
input a Stream<i128>
input b Stream<i128>
output diff Stream<i128>
)]
pub async fn sub() {
while let (Ok(a), Ok(b)) = (a.recv_one_i128().await, b.recv_one_i128().await) {
check!(diff.send_one_i128(a - b).await)
}
}
#[mel_treatment(
input a Stream<i128>
input b Stream<i128>
output min Stream<i128>
)]
pub async fn min() {
while let (Ok(a), Ok(b)) = (a.recv_one_i128().await, b.recv_one_i128().await) {
check!(min.send_one_i128(a.min(b)).await)
}
}
#[mel_treatment(
input a Stream<i128>
input b Stream<i128>
output max Stream<i128>
)]
pub async fn max() {
while let (Ok(a), Ok(b)) = (a.recv_one_i128().await, b.recv_one_i128().await) {
check!(max.send_one_i128(a.max(b)).await)
}
}
#[mel_treatment(
input a Stream<i128>
input b Stream<i128>
output is Stream<bool>
)]
pub async fn lower_than() {
while let (Ok(a), Ok(b)) = (a.recv_one_i128().await, b.recv_one_i128().await) {
check!(is.send_one_bool(a < b).await)
}
}
#[mel_treatment(
input a Stream<i128>
input b Stream<i128>
output is Stream<bool>
)]
pub async fn greater_than() {
while let (Ok(a), Ok(b)) = (a.recv_one_i128().await, b.recv_one_i128().await) {
check!(is.send_one_bool(a > b).await)
}
}
#[mel_function]
pub fn abs(value: i128) -> i128 {
value.abs()
}
#[mel_treatment(
input value Stream<i128>
output abs Stream<i128>
)]
pub async fn abs() {
while let Ok(values) = value.recv_i128().await {
check!(
abs.send_i128(values.into_iter().map(|v| v.abs()).collect())
.await
)
}
}