use crate::prelude::*;
pub struct Trailing<S: SignalMut> {
pub sgn: S,
}
impl<S: SignalMut> Trailing<S> {
pub const fn new(sgn: S) -> Self {
Self { sgn }
}
}
impl<S: SignalMut> Signal for Trailing<S> {
type Sample = S::Sample;
fn get(&self) -> S::Sample {
self.sgn.get()
}
}
impl<S: SignalMut> SignalMut for Trailing<S> {
fn advance(&mut self) {
self.sgn.advance();
}
fn retrigger(&mut self) {
self.sgn.retrigger();
}
}
impl<S: Frequency> Frequency for Trailing<S> {
fn freq(&self) -> unt::Freq {
self.sgn.freq()
}
fn freq_mut(&mut self) -> &mut unt::Freq {
self.sgn.freq_mut()
}
}
impl<S: Base> Base for Trailing<S> {
type Base = S::Base;
fn base(&self) -> &S::Base {
self.sgn.base()
}
fn base_mut(&mut self) -> &mut S::Base {
self.sgn.base_mut()
}
}
impl<S: SignalMut> Done for Trailing<S> {
fn is_done(&self) -> bool {
false
}
}
impl<S: SignalMut> Stop for Trailing<S> {
fn stop(&mut self) {}
}
pub struct Stopping<S: SignalMut> {
pub sgn: S,
done: bool,
}
impl<S: SignalMut> Stopping<S> {
pub const fn new(sgn: S) -> Self {
Self { sgn, done: false }
}
}
impl<S: SignalMut> Signal for Stopping<S> {
type Sample = S::Sample;
fn get(&self) -> S::Sample {
if self.done {
S::Sample::ZERO
} else {
self.sgn.get()
}
}
}
impl<S: SignalMut> SignalMut for Stopping<S> {
fn advance(&mut self) {
self.sgn.advance();
}
fn retrigger(&mut self) {
self.sgn.retrigger();
self.done = false;
}
}
impl<S: Frequency> Frequency for Stopping<S> {
fn freq(&self) -> unt::Freq {
self.sgn.freq()
}
fn freq_mut(&mut self) -> &mut unt::Freq {
self.sgn.freq_mut()
}
}
impl<S: Base> Base for Stopping<S> {
type Base = S::Base;
fn base(&self) -> &S::Base {
self.sgn.base()
}
fn base_mut(&mut self) -> &mut S::Base {
self.sgn.base_mut()
}
}
impl<S: SignalMut> Done for Stopping<S> {
fn is_done(&self) -> bool {
self.done
}
}
impl<S: SignalMut> Stop for Stopping<S> {
fn stop(&mut self) {
self.done = true;
}
}
#[derive(Clone, Copy, Debug, Default)]
pub struct Retrigger;
impl<S: SignalMut> map::Mut<S> for Retrigger {
fn modify(&mut self, sgn: &mut S) {
sgn.retrigger();
}
}