Skip to main content

std_mel/ops/
float.rs

1use melodium_core::*;
2use melodium_macro::{check, mel_function, mel_treatment};
3
4/// Tells if a value is not a number.
5///
6/// Returns `true` if value is `NaN`.
7#[mel_function(
8    generic F (Float)
9)]
10pub fn is_nan(value: F) -> bool {
11    value.float_is_nan()
12}
13
14/// Tells if a stream contains not-a-number values.
15///
16/// Output `true` if value is `NaN`.  
17#[mel_treatment(
18    generic F (Float)
19    input value Stream<F>
20    output nan Stream<bool>
21)]
22pub async fn is_nan() {
23    while let Ok(values) = value
24        .recv_many()
25        .await
26        .map(|values| Into::<VecDeque<Value>>::into(values))
27    {
28        check!(
29            nan.send_many_as(
30                values
31                    .into_iter()
32                    .map(|val| val.float_is_nan())
33                    .collect::<Vec<_>>()
34            )
35            .await
36        )
37    }
38}
39
40/// Tells if a value is finite.
41///
42/// Returns `true` if value is not infinite nor `NaN`.
43#[mel_function(
44    generic F (Float)
45)]
46pub fn is_finite(value: F) -> bool {
47    value.float_is_finite()
48}
49
50/// Tells if a stream contains finite values.
51///
52/// Output `true` if value is not infinite nor `NaN`.  
53#[mel_treatment(
54    generic F (Float)
55    input value Stream<F>
56    output finite Stream<bool>
57)]
58pub async fn is_finite() {
59    while let Ok(values) = value
60        .recv_many()
61        .await
62        .map(|values| Into::<VecDeque<Value>>::into(values))
63    {
64        check!(
65            finite
66                .send_many_as(
67                    values
68                        .into_iter()
69                        .map(|val| val.float_is_finite())
70                        .collect::<Vec<_>>()
71                )
72                .await
73        )
74    }
75}
76
77/// Tells if a value is infinite.
78#[mel_function(
79    generic F (Float)
80)]
81pub fn is_infinite(value: F) -> bool {
82    value.float_is_infinite()
83}
84
85/// Tells if a stream contains infinite values.
86#[mel_treatment(
87    generic F (Float)
88    input value Stream<F>
89    output infinite Stream<bool>
90)]
91pub async fn is_infinite() {
92    while let Ok(values) = value
93        .recv_many()
94        .await
95        .map(|values| Into::<VecDeque<Value>>::into(values))
96    {
97        check!(
98            infinite
99                .send_many_as(
100                    values
101                        .into_iter()
102                        .map(|val| val.float_is_infinite())
103                        .collect::<Vec<_>>()
104                )
105                .await
106        )
107    }
108}
109
110/// Tells if a value is normal.
111///
112/// Returns `true` if the number is neither zero, infinite, [subnormal](https://en.wikipedia.org/wiki/Subnormal_number), or NaN.
113#[mel_function(
114    generic F (Float)
115)]
116pub fn is_normal(value: F) -> bool {
117    value.float_is_normal()
118}
119
120/// Tells if a stream contains normal values.
121///
122/// Output `true` if value is neither zero, infinite, [subnormal](https://en.wikipedia.org/wiki/Subnormal_number), or NaN.
123#[mel_treatment(
124    generic F (Float)
125    input value Stream<F>
126    output normal Stream<bool>
127)]
128pub async fn is_normal() {
129    while let Ok(values) = value
130        .recv_many()
131        .await
132        .map(|values| Into::<VecDeque<Value>>::into(values))
133    {
134        check!(
135            normal
136                .send_many_as(
137                    values
138                        .into_iter()
139                        .map(|val| val.float_is_normal())
140                        .collect::<Vec<_>>()
141                )
142                .await
143        )
144    }
145}
146
147/// Tells if a value is subnormal.
148///
149/// Returns `true` if the number is [subnormal](https://en.wikipedia.org/wiki/Subnormal_number).
150#[mel_function(
151    generic F (Float)
152)]
153pub fn is_subnormal(value: F) -> bool {
154    value.float_is_subnormal()
155}
156
157/// Tells if a stream contains subnormal values.
158///
159/// Outputs `true` if the number is [subnormal](https://en.wikipedia.org/wiki/Subnormal_number).
160#[mel_treatment(
161    generic F (Float)
162    input value Stream<F>
163    output subnormal Stream<bool>
164)]
165pub async fn is_subnormal() {
166    while let Ok(values) = value
167        .recv_many()
168        .await
169        .map(|values| Into::<VecDeque<Value>>::into(values))
170    {
171        check!(
172            subnormal
173                .send_many_as(
174                    values
175                        .into_iter()
176                        .map(|val| val.float_is_subnormal())
177                        .collect::<Vec<_>>()
178                )
179                .await
180        )
181    }
182}
183
184/// Return largest integer less than or equal to `val`
185#[mel_function(
186    generic F (Float)
187)]
188pub fn floor(val: F) -> F {
189    val.float_floor()
190}
191
192/// Computes largest integer less than or equal to of streamed values.
193#[mel_treatment(
194    generic F (Float)
195    input value Stream<F>
196    output floor Stream<F>
197)]
198pub async fn floor() {
199    while let Ok(values) = value
200        .recv_many()
201        .await
202        .map(|values| Into::<VecDeque<Value>>::into(values))
203    {
204        check!(
205            floor
206                .send_many(TransmissionValue::Other(
207                    values.into_iter().map(|val| val.float_floor()).collect()
208                ))
209                .await
210        )
211    }
212}
213/// Return smallest integer greater than or equal to `val`
214#[mel_function(
215    generic F (Float)
216)]
217pub fn ceil(val: F) -> F {
218    val.float_ceil()
219}
220
221/// Computes smallest integer greater than or equal to of streamed values.
222#[mel_treatment(
223    generic F (Float)
224    input value Stream<F>
225    output ceil Stream<F>
226)]
227pub async fn ceil() {
228    while let Ok(values) = value
229        .recv_many()
230        .await
231        .map(|values| Into::<VecDeque<Value>>::into(values))
232    {
233        check!(
234            ceil.send_many(TransmissionValue::Other(
235                values.into_iter().map(|val| val.float_ceil()).collect()
236            ))
237            .await
238        )
239    }
240}
241/// Return nearest integer to `val`
242#[mel_function(
243    generic F (Float)
244)]
245pub fn round(val: F) -> F {
246    val.float_round()
247}
248
249/// Computes nearest integer to of streamed values.
250#[mel_treatment(
251    generic F (Float)
252    input value Stream<F>
253    output round Stream<F>
254)]
255pub async fn round() {
256    while let Ok(values) = value
257        .recv_many()
258        .await
259        .map(|values| Into::<VecDeque<Value>>::into(values))
260    {
261        check!(
262            round
263                .send_many(TransmissionValue::Other(
264                    values.into_iter().map(|val| val.float_round()).collect()
265                ))
266                .await
267        )
268    }
269}
270/// Return integer part of `val`
271#[mel_function(
272    generic F (Float)
273)]
274pub fn trunc(val: F) -> F {
275    val.float_trunc()
276}
277
278/// Computes integer part of streamed values.
279#[mel_treatment(
280    generic F (Float)
281    input value Stream<F>
282    output trunc Stream<F>
283)]
284pub async fn trunc() {
285    while let Ok(values) = value
286        .recv_many()
287        .await
288        .map(|values| Into::<VecDeque<Value>>::into(values))
289    {
290        check!(
291            trunc
292                .send_many(TransmissionValue::Other(
293                    values.into_iter().map(|val| val.float_trunc()).collect()
294                ))
295                .await
296        )
297    }
298}
299/// Return fractional part of `val`
300#[mel_function(
301    generic F (Float)
302)]
303pub fn fract(val: F) -> F {
304    val.float_fract()
305}
306
307/// Computes fractional part of streamed values.
308#[mel_treatment(
309    generic F (Float)
310    input value Stream<F>
311    output fract Stream<F>
312)]
313pub async fn fract() {
314    while let Ok(values) = value
315        .recv_many()
316        .await
317        .map(|values| Into::<VecDeque<Value>>::into(values))
318    {
319        check!(
320            fract
321                .send_many(TransmissionValue::Other(
322                    values.into_iter().map(|val| val.float_fract()).collect()
323                ))
324                .await
325        )
326    }
327}
328/// Return inverse of `val`
329#[mel_function(
330    generic F (Float)
331)]
332pub fn recip(val: F) -> F {
333    val.float_recip()
334}
335
336/// Computes inverse of streamed values.
337#[mel_treatment(
338    generic F (Float)
339    input value Stream<F>
340    output recip Stream<F>
341)]
342pub async fn recip() {
343    while let Ok(values) = value
344        .recv_many()
345        .await
346        .map(|values| Into::<VecDeque<Value>>::into(values))
347    {
348        check!(
349            recip
350                .send_many(TransmissionValue::Other(
351                    values.into_iter().map(|val| val.float_recip()).collect()
352                ))
353                .await
354        )
355    }
356}
357
358/// Compute exponent of given value
359#[mel_function(
360    generic F (Float)
361)]
362pub fn pow(val: F, exp: F) -> F {
363    val.float_pow(&exp)
364}
365
366/// Compute exponent of streamed values
367#[mel_treatment(
368    generic F (Float)
369    input value Stream<F>
370    output pow Stream<F>
371)]
372pub async fn pow(exp: F) {
373    while let Ok(values) = value
374        .recv_many()
375        .await
376        .map(|values| Into::<VecDeque<Value>>::into(values))
377    {
378        check!(
379            pow.send_many(TransmissionValue::Other(
380                values.into_iter().map(|val| val.float_pow(&exp)).collect()
381            ))
382            .await
383        )
384    }
385}
386
387/// Return square root of `val`
388#[mel_function(
389    generic F (Float)
390)]
391pub fn sqrt(val: F) -> F {
392    val.float_sqrt()
393}
394
395/// Computes square root of streamed values.
396#[mel_treatment(
397    generic F (Float)
398    input value Stream<F>
399    output sqrt Stream<F>
400)]
401pub async fn sqrt() {
402    while let Ok(values) = value
403        .recv_many()
404        .await
405        .map(|values| Into::<VecDeque<Value>>::into(values))
406    {
407        check!(
408            sqrt.send_many(TransmissionValue::Other(
409                values.into_iter().map(|val| val.float_sqrt()).collect()
410            ))
411            .await
412        )
413    }
414}
415/// Return exponential of `val`
416#[mel_function(
417    generic F (Float)
418)]
419pub fn exp(val: F) -> F {
420    val.float_exp()
421}
422
423/// Computes exponential of streamed values.
424#[mel_treatment(
425    generic F (Float)
426    input value Stream<F>
427    output exp Stream<F>
428)]
429pub async fn exp() {
430    while let Ok(values) = value
431        .recv_many()
432        .await
433        .map(|values| Into::<VecDeque<Value>>::into(values))
434    {
435        check!(
436            exp.send_many(TransmissionValue::Other(
437                values.into_iter().map(|val| val.float_exp()).collect()
438            ))
439            .await
440        )
441    }
442}
443/// Return 2 powered by  `val`
444#[mel_function(
445    generic F (Float)
446)]
447pub fn exp2(val: F) -> F {
448    val.float_exp2()
449}
450
451/// Computes 2 powered by  of streamed values.
452#[mel_treatment(
453    generic F (Float)
454    input value Stream<F>
455    output exp2 Stream<F>
456)]
457pub async fn exp2() {
458    while let Ok(values) = value
459        .recv_many()
460        .await
461        .map(|values| Into::<VecDeque<Value>>::into(values))
462    {
463        check!(
464            exp2.send_many(TransmissionValue::Other(
465                values.into_iter().map(|val| val.float_exp2()).collect()
466            ))
467            .await
468        )
469    }
470}
471/// Return natural logarithm of `val`
472#[mel_function(
473    generic F (Float)
474)]
475pub fn ln(val: F) -> F {
476    val.float_ln()
477}
478
479/// Computes natural logarithm of streamed values.
480#[mel_treatment(
481    generic F (Float)
482    input value Stream<F>
483    output ln Stream<F>
484)]
485pub async fn ln() {
486    while let Ok(values) = value
487        .recv_many()
488        .await
489        .map(|values| Into::<VecDeque<Value>>::into(values))
490    {
491        check!(
492            ln.send_many(TransmissionValue::Other(
493                values.into_iter().map(|val| val.float_ln()).collect()
494            ))
495            .await
496        )
497    }
498}
499
500/// Compute logarithm of given value
501#[mel_function(
502    generic F (Float)
503)]
504pub fn log(val: F, base: F) -> F {
505    val.float_log(&base)
506}
507
508/// Compute logarithm of streamed values
509#[mel_treatment(
510    generic F (Float)
511    input value Stream<F>
512    output log Stream<F>
513)]
514pub async fn log(base: F) {
515    while let Ok(values) = value
516        .recv_many()
517        .await
518        .map(|values| Into::<VecDeque<Value>>::into(values))
519    {
520        check!(
521            log.send_many(TransmissionValue::Other(
522                values.into_iter().map(|val| val.float_log(&base)).collect()
523            ))
524            .await
525        )
526    }
527}
528
529/// Return base 2 logarithm of `val`
530#[mel_function(
531    generic F (Float)
532)]
533pub fn log2(val: F) -> F {
534    val.float_log2()
535}
536
537/// Computes base 2 logarithm of streamed values.
538#[mel_treatment(
539    generic F (Float)
540    input value Stream<F>
541    output log2 Stream<F>
542)]
543pub async fn log2() {
544    while let Ok(values) = value
545        .recv_many()
546        .await
547        .map(|values| Into::<VecDeque<Value>>::into(values))
548    {
549        check!(
550            log2.send_many(TransmissionValue::Other(
551                values.into_iter().map(|val| val.float_log2()).collect()
552            ))
553            .await
554        )
555    }
556}
557/// Return base 10 logarithm of `val`
558#[mel_function(
559    generic F (Float)
560)]
561pub fn log10(val: F) -> F {
562    val.float_log10()
563}
564
565/// Computes base 10 logarithm of streamed values.
566#[mel_treatment(
567    generic F (Float)
568    input value Stream<F>
569    output log10 Stream<F>
570)]
571pub async fn log10() {
572    while let Ok(values) = value
573        .recv_many()
574        .await
575        .map(|values| Into::<VecDeque<Value>>::into(values))
576    {
577        check!(
578            log10
579                .send_many(TransmissionValue::Other(
580                    values.into_iter().map(|val| val.float_log10()).collect()
581                ))
582                .await
583        )
584    }
585}
586/// Return cube root of `val`
587#[mel_function(
588    generic F (Float)
589)]
590pub fn cbrt(val: F) -> F {
591    val.float_cbrt()
592}
593
594/// Computes cube root of streamed values.
595#[mel_treatment(
596    generic F (Float)
597    input value Stream<F>
598    output cbrt Stream<F>
599)]
600pub async fn cbrt() {
601    while let Ok(values) = value
602        .recv_many()
603        .await
604        .map(|values| Into::<VecDeque<Value>>::into(values))
605    {
606        check!(
607            cbrt.send_many(TransmissionValue::Other(
608                values.into_iter().map(|val| val.float_cbrt()).collect()
609            ))
610            .await
611        )
612    }
613}
614
615/// Compute hypotenuse of given value
616#[mel_function(
617    generic F (Float)
618)]
619pub fn hypot(val: F, n: F) -> F {
620    val.float_hypot(&n)
621}
622
623/// Compute exponent of streamed values
624#[mel_treatment(
625    generic F (Float)
626    input value Stream<F>
627    output hypot Stream<F>
628)]
629pub async fn hypot(n: F) {
630    while let Ok(values) = value
631        .recv_many()
632        .await
633        .map(|values| Into::<VecDeque<Value>>::into(values))
634    {
635        check!(
636            hypot
637                .send_many(TransmissionValue::Other(
638                    values.into_iter().map(|val| val.float_hypot(&n)).collect()
639                ))
640                .await
641        )
642    }
643}
644
645/// Return sine of `val`
646#[mel_function(
647    generic F (Float)
648)]
649pub fn sin(val: F) -> F {
650    val.float_sin()
651}
652
653/// Computes sine of streamed values.
654#[mel_treatment(
655    generic F (Float)
656    input value Stream<F>
657    output sin Stream<F>
658)]
659pub async fn sin() {
660    while let Ok(values) = value
661        .recv_many()
662        .await
663        .map(|values| Into::<VecDeque<Value>>::into(values))
664    {
665        check!(
666            sin.send_many(TransmissionValue::Other(
667                values.into_iter().map(|val| val.float_sin()).collect()
668            ))
669            .await
670        )
671    }
672}
673/// Return cosine of `val`
674#[mel_function(
675    generic F (Float)
676)]
677pub fn cos(val: F) -> F {
678    val.float_cos()
679}
680
681/// Computes cosine of streamed values.
682#[mel_treatment(
683    generic F (Float)
684    input value Stream<F>
685    output cos Stream<F>
686)]
687pub async fn cos() {
688    while let Ok(values) = value
689        .recv_many()
690        .await
691        .map(|values| Into::<VecDeque<Value>>::into(values))
692    {
693        check!(
694            cos.send_many(TransmissionValue::Other(
695                values.into_iter().map(|val| val.float_cos()).collect()
696            ))
697            .await
698        )
699    }
700}
701/// Return tangent of `val`
702#[mel_function(
703    generic F (Float)
704)]
705pub fn tan(val: F) -> F {
706    val.float_tan()
707}
708
709/// Computes tangent of streamed values.
710#[mel_treatment(
711    generic F (Float)
712    input value Stream<F>
713    output tan Stream<F>
714)]
715pub async fn tan() {
716    while let Ok(values) = value
717        .recv_many()
718        .await
719        .map(|values| Into::<VecDeque<Value>>::into(values))
720    {
721        check!(
722            tan.send_many(TransmissionValue::Other(
723                values.into_iter().map(|val| val.float_tan()).collect()
724            ))
725            .await
726        )
727    }
728}
729/// Return arcsine of `val`
730#[mel_function(
731    generic F (Float)
732)]
733pub fn asin(val: F) -> F {
734    val.float_asin()
735}
736
737/// Computes arcsine of streamed values.
738#[mel_treatment(
739    generic F (Float)
740    input value Stream<F>
741    output asin Stream<F>
742)]
743pub async fn asin() {
744    while let Ok(values) = value
745        .recv_many()
746        .await
747        .map(|values| Into::<VecDeque<Value>>::into(values))
748    {
749        check!(
750            asin.send_many(TransmissionValue::Other(
751                values.into_iter().map(|val| val.float_asin()).collect()
752            ))
753            .await
754        )
755    }
756}
757/// Return arcosine of `val`
758#[mel_function(
759    generic F (Float)
760)]
761pub fn acos(val: F) -> F {
762    val.float_acos()
763}
764
765/// Computes arcosine of streamed values.
766#[mel_treatment(
767    generic F (Float)
768    input value Stream<F>
769    output acos Stream<F>
770)]
771pub async fn acos() {
772    while let Ok(values) = value
773        .recv_many()
774        .await
775        .map(|values| Into::<VecDeque<Value>>::into(values))
776    {
777        check!(
778            acos.send_many(TransmissionValue::Other(
779                values.into_iter().map(|val| val.float_acos()).collect()
780            ))
781            .await
782        )
783    }
784}
785/// Return arctangent of `val`
786#[mel_function(
787    generic F (Float)
788)]
789pub fn atan(val: F) -> F {
790    val.float_atan()
791}
792
793/// Computes arctangent of streamed values.
794#[mel_treatment(
795    generic F (Float)
796    input value Stream<F>
797    output atan Stream<F>
798)]
799pub async fn atan() {
800    while let Ok(values) = value
801        .recv_many()
802        .await
803        .map(|values| Into::<VecDeque<Value>>::into(values))
804    {
805        check!(
806            atan.send_many(TransmissionValue::Other(
807                values.into_iter().map(|val| val.float_atan()).collect()
808            ))
809            .await
810        )
811    }
812}
813
814/// Compute the four quadrant arctangent of value and n
815#[mel_function(
816    generic F (Float)
817)]
818pub fn atan2(val: F, n: F) -> F {
819    val.float_atan2(&n)
820}
821
822/// Compute the four quadrant arctangent of streamed values
823#[mel_treatment(
824    generic F (Float)
825    input value Stream<F>
826    output atan2 Stream<F>
827)]
828pub async fn atan2(n: F) {
829    while let Ok(values) = value
830        .recv_many()
831        .await
832        .map(|values| Into::<VecDeque<Value>>::into(values))
833    {
834        check!(
835            atan2
836                .send_many(TransmissionValue::Other(
837                    values.into_iter().map(|val| val.float_atan2(&n)).collect()
838                ))
839                .await
840        )
841    }
842}
843
844/// Return hyperbolic sine `val`
845#[mel_function(
846    generic F (Float)
847)]
848pub fn sinh(val: F) -> F {
849    val.float_sinh()
850}
851
852/// Computes hyperbolic sine of streamed values.
853#[mel_treatment(
854    generic F (Float)
855    input value Stream<F>
856    output sinh Stream<F>
857)]
858pub async fn sinh() {
859    while let Ok(values) = value
860        .recv_many()
861        .await
862        .map(|values| Into::<VecDeque<Value>>::into(values))
863    {
864        check!(
865            sinh.send_many(TransmissionValue::Other(
866                values.into_iter().map(|val| val.float_sinh()).collect()
867            ))
868            .await
869        )
870    }
871}
872/// Return hyperbolic cosine `val`
873#[mel_function(
874    generic F (Float)
875)]
876pub fn cosh(val: F) -> F {
877    val.float_cosh()
878}
879
880/// Computes hyperbolic cosine of streamed values.
881#[mel_treatment(
882    generic F (Float)
883    input value Stream<F>
884    output cosh Stream<F>
885)]
886pub async fn cosh() {
887    while let Ok(values) = value
888        .recv_many()
889        .await
890        .map(|values| Into::<VecDeque<Value>>::into(values))
891    {
892        check!(
893            cosh.send_many(TransmissionValue::Other(
894                values.into_iter().map(|val| val.float_cosh()).collect()
895            ))
896            .await
897        )
898    }
899}
900/// Return hyperbolic tangent `val`
901#[mel_function(
902    generic F (Float)
903)]
904pub fn tanh(val: F) -> F {
905    val.float_tanh()
906}
907
908/// Computes hyperbolic tangent of streamed values.
909#[mel_treatment(
910    generic F (Float)
911    input value Stream<F>
912    output tanh Stream<F>
913)]
914pub async fn tanh() {
915    while let Ok(values) = value
916        .recv_many()
917        .await
918        .map(|values| Into::<VecDeque<Value>>::into(values))
919    {
920        check!(
921            tanh.send_many(TransmissionValue::Other(
922                values.into_iter().map(|val| val.float_tanh()).collect()
923            ))
924            .await
925        )
926    }
927}
928/// Return inverse hyperbolic sine `val`
929#[mel_function(
930    generic F (Float)
931)]
932pub fn asinh(val: F) -> F {
933    val.float_asinh()
934}
935
936/// Computes inverse hyperbolic sine of streamed values.
937#[mel_treatment(
938    generic F (Float)
939    input value Stream<F>
940    output asinh Stream<F>
941)]
942pub async fn asinh() {
943    while let Ok(values) = value
944        .recv_many()
945        .await
946        .map(|values| Into::<VecDeque<Value>>::into(values))
947    {
948        check!(
949            asinh
950                .send_many(TransmissionValue::Other(
951                    values.into_iter().map(|val| val.float_asinh()).collect()
952                ))
953                .await
954        )
955    }
956}
957/// Return inverse hyperbolic cosine `val`
958#[mel_function(
959    generic F (Float)
960)]
961pub fn acosh(val: F) -> F {
962    val.float_acosh()
963}
964
965/// Computes inverse hyperbolic cosine of streamed values.
966#[mel_treatment(
967    generic F (Float)
968    input value Stream<F>
969    output acosh Stream<F>
970)]
971pub async fn acosh() {
972    while let Ok(values) = value
973        .recv_many()
974        .await
975        .map(|values| Into::<VecDeque<Value>>::into(values))
976    {
977        check!(
978            acosh
979                .send_many(TransmissionValue::Other(
980                    values.into_iter().map(|val| val.float_acosh()).collect()
981                ))
982                .await
983        )
984    }
985}
986/// Return inverse hyperbolic tangent `val`
987#[mel_function(
988    generic F (Float)
989)]
990pub fn atanh(val: F) -> F {
991    val.float_atanh()
992}
993
994/// Computes inverse hyperbolic tangent of streamed values.
995#[mel_treatment(
996    generic F (Float)
997    input value Stream<F>
998    output atanh Stream<F>
999)]
1000pub async fn atanh() {
1001    while let Ok(values) = value
1002        .recv_many()
1003        .await
1004        .map(|values| Into::<VecDeque<Value>>::into(values))
1005    {
1006        check!(
1007            atanh
1008                .send_many(TransmissionValue::Other(
1009                    values.into_iter().map(|val| val.float_atanh()).collect()
1010                ))
1011                .await
1012        )
1013    }
1014}
1015/// Return conversion to degrees of `val`
1016#[mel_function(
1017    generic F (Float)
1018)]
1019pub fn to_degrees(val: F) -> F {
1020    val.float_to_degrees()
1021}
1022
1023/// Computes conversion to degrees of streamed values.
1024#[mel_treatment(
1025    generic F (Float)
1026    input value Stream<F>
1027    output to_degrees Stream<F>
1028)]
1029pub async fn to_degrees() {
1030    while let Ok(values) = value
1031        .recv_many()
1032        .await
1033        .map(|values| Into::<VecDeque<Value>>::into(values))
1034    {
1035        check!(
1036            to_degrees
1037                .send_many(TransmissionValue::Other(
1038                    values
1039                        .into_iter()
1040                        .map(|val| val.float_to_degrees())
1041                        .collect()
1042                ))
1043                .await
1044        )
1045    }
1046}
1047/// Return conversion to radians of `val`
1048#[mel_function(
1049    generic F (Float)
1050)]
1051pub fn to_radians(val: F) -> F {
1052    val.float_to_radians()
1053}
1054
1055/// Computes conversion to radians of streamed values.
1056#[mel_treatment(
1057    generic F (Float)
1058    input value Stream<F>
1059    output to_radians Stream<F>
1060)]
1061pub async fn to_radians() {
1062    while let Ok(values) = value
1063        .recv_many()
1064        .await
1065        .map(|values| Into::<VecDeque<Value>>::into(values))
1066    {
1067        check!(
1068            to_radians
1069                .send_many(TransmissionValue::Other(
1070                    values
1071                        .into_iter()
1072                        .map(|val| val.float_to_radians())
1073                        .collect()
1074                ))
1075                .await
1076        )
1077    }
1078}