1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131
use melodium_core::*;
use melodium_macro::{check, mel_function, mel_treatment};
pub mod block;
/// Unwrap option of return default value
#[mel_function(
generic T ()
)]
pub fn unwrap_or(option: Option<T>, default: T) -> T {
option.unwrap_or(default)
}
/// Unwrap option stream
///
/// Unwrap every option in stream, ignoring values set to _none_.
#[mel_treatment(
generic T ()
input option Stream<Option<T>>
output value Stream<T>
)]
pub async fn unwrap() {
while let Ok(values) = option
.recv_many()
.await
.map(|values| Into::<VecDeque<Value>>::into(values))
{
check!(
value
.send_many(TransmissionValue::Other(
values
.into_iter()
.filter_map(|val| match val {
Value::Option(Some(val)) => Some(*val),
_ => None,
})
.collect()
))
.await
)
}
}
/// Unwrap option stream with default value
///
/// Unwrap every option in stream, sending `default` value when option is _none_.
#[mel_treatment(
generic T ()
input option Stream<Option<T>>
output value Stream<T>
)]
pub async fn unwrap_or(default: T) {
while let Ok(values) = option
.recv_many()
.await
.map(|values| Into::<VecDeque<Value>>::into(values))
{
check!(
value
.send_many(TransmissionValue::Other(
values
.into_iter()
.filter_map(|val| match val {
Value::Option(Some(val)) => Some(*val),
Value::Option(None) => Some(default.clone()),
_ => None,
})
.collect()
))
.await
)
}
}
/// Unwrap option stream until _none_ is present
///
/// Unwrap every option in stream, and stop at the first _none_ value encountered.
#[mel_treatment(
generic T ()
input option Stream<Option<T>>
output value Stream<T>
)]
pub async fn fuse() {
'main: while let Ok(values) = option
.recv_many()
.await
.map(|values| Into::<VecDeque<Value>>::into(values))
{
for val in values {
match val {
Value::Option(Some(val)) => check!('main, value.send_one(*val).await),
_ => break 'main,
}
}
}
}
/// Wrap a value in an option
#[mel_function(
generic T ()
)]
pub fn wrap(value: T) -> Option<T> {
Some(value)
}
/// Wrap values in options
///
/// Takes a stream of values and turn them into filled options.
#[mel_treatment(
generic T ()
input value Stream<T>
output option Stream<Option<T>>
)]
pub async fn wrap() {
while let Ok(values) = value
.recv_many()
.await
.map(|values| Into::<VecDeque<Value>>::into(values))
{
check!(
option
.send_many(TransmissionValue::Other(
values
.into_iter()
.map(|val| Value::Option(Some(Box::new(val))))
.collect()
))
.await
)
}
}