use crate::prelude::*;
use std::cell::UnsafeCell;
pub struct Stereo<X: Signal<Sample = smp::Mono>, Y: Signal<Sample = smp::Mono>>(pub X, pub Y);
impl<X: Signal<Sample = smp::Mono>, Y: Signal<Sample = smp::Mono>> Stereo<X, Y> {
pub const fn new(sgn1: X, sgn2: Y) -> Self {
Self(sgn1, sgn2)
}
}
impl<Z: Signal<Sample = smp::Mono> + Clone> Stereo<Z, Z> {
pub fn dup(sgn: Z) -> Self {
Self(sgn.clone(), sgn)
}
}
impl<X: Signal<Sample = smp::Mono>, Y: Signal<Sample = smp::Mono>> Signal for Stereo<X, Y> {
type Sample = smp::Stereo;
fn get(&self) -> Self::Sample {
smp::Stereo(self.0.get().0, self.1.get().0)
}
}
impl<X: SignalMut<Sample = smp::Mono>, Y: SignalMut<Sample = smp::Mono>> SignalMut
for Stereo<X, Y>
{
fn advance(&mut self) {
self.0.advance();
self.1.advance();
}
fn retrigger(&mut self) {
self.0.retrigger();
self.1.retrigger();
}
}
impl<X: Done<Sample = smp::Mono>, Y: Done<Sample = smp::Mono>> Done for Stereo<X, Y> {
fn is_done(&self) -> bool {
self.0.is_done() && self.1.is_done()
}
}
impl<X: Stop<Sample = smp::Mono>, Y: Stop<Sample = smp::Mono>> Stop for Stereo<X, Y> {
fn stop(&mut self) {
self.0.stop();
self.1.stop();
}
}
impl<X: Panic<Sample = smp::Mono>, Y: Panic<Sample = smp::Mono>> Panic for Stereo<X, Y> {
fn panic(&mut self) {
self.0.panic();
self.1.panic();
}
}
pub struct Mix<X: Signal, Y: Signal<Sample = X::Sample>>(pub X, pub Y);
impl<X: Signal, Y: Signal<Sample = X::Sample>> Mix<X, Y> {
pub const fn new(x: X, y: Y) -> Self {
Self(x, y)
}
}
impl<X: Signal, Y: Signal<Sample = X::Sample>> Signal for Mix<X, Y> {
type Sample = X::Sample;
fn get(&self) -> Self::Sample {
self.0.get() + self.1.get()
}
}
impl<X: SignalMut, Y: SignalMut<Sample = X::Sample>> SignalMut for Mix<X, Y> {
fn advance(&mut self) {
self.0.advance();
self.1.advance();
}
fn retrigger(&mut self) {
self.0.retrigger();
self.1.retrigger();
}
}
impl<X: Done, Y: Done<Sample = X::Sample>> Done for Mix<X, Y> {
fn is_done(&self) -> bool {
self.0.is_done() && self.1.is_done()
}
}
impl<X: Stop, Y: Stop<Sample = X::Sample>> Stop for Mix<X, Y> {
fn stop(&mut self) {
self.0.stop();
self.1.stop();
}
}
impl<X: Panic, Y: Panic<Sample = X::Sample>> Panic for Mix<X, Y> {
fn panic(&mut self) {
self.0.panic();
self.1.panic();
}
}
#[derive(Clone, Copy, Debug, Default)]
pub struct Dup;
impl Map for Dup {
type Input = smp::Mono;
type Output = smp::Stereo;
fn eval(&self, x: smp::Mono) -> smp::Stereo {
x.duplicate()
}
}
pub type Duplicate<S> = eff::MapSgn<S, Dup>;
impl<S: Signal<Sample = smp::Mono>> Duplicate<S> {
pub const fn new_dup(sgn: S) -> Self {
Self::new(sgn, Dup)
}
}
pub struct Ref<'a, S: Signal>(pub &'a S);
impl<'a, S: Signal> Ref<'a, S> {
pub const fn new(sgn: &'a S) -> Self {
Self(sgn)
}
}
impl<'a, S: Signal> Signal for Ref<'a, S> {
type Sample = S::Sample;
fn get(&self) -> S::Sample {
self.0.get()
}
}
impl<'a, S: Done> Done for Ref<'a, S> {
fn is_done(&self) -> bool {
self.0.is_done()
}
}
pub struct Cell<S: Signal>(UnsafeCell<S>);
impl<S: Signal> Cell<S> {
pub const fn new(sgn: S) -> Self {
Self(UnsafeCell::new(sgn))
}
pub fn modify<F: FnMut(&mut S)>(&self, mut func: F) {
func(unsafe { &mut *self.0.get() });
}
}
impl<S: SignalMut> Cell<S> {
pub fn advance(&self) {
self.modify(SignalMut::advance);
}
pub fn next(&self) -> S::Sample {
self.advance();
self._get()
}
}
impl<S: Signal> AsMut<S> for Cell<S> {
fn as_mut(&mut self) -> &mut S {
self.0.get_mut()
}
}
impl<S: Signal> Signal for Cell<S> {
type Sample = S::Sample;
fn get(&self) -> Self::Sample {
(unsafe { &*self.0.get() })._get()
}
}
impl<S: Done> Done for Cell<S> {
fn is_done(&self) -> bool {
(unsafe { &*self.0.get() }).is_done()
}
}