#![feature(type_alias_impl_trait)] mod time; pub use self::time::*; mod note; pub use self::note::*; pub mod jack; pub use self::jack::*; pub mod midi; pub use self::midi::*; pub(crate) use std::sync::{Arc, atomic::{AtomicUsize, AtomicBool, Ordering::Relaxed}}; pub(crate) use std::fmt::Debug; pub(crate) use std::ops::{Add, Sub, Mul, Div, Rem}; pub(crate) use ::tengri::tui::*; pub use ::atomic_float; pub(crate) use atomic_float::*; /// Standard result type. pub(crate) type Usually = std::result::Result>; /// Standard optional result type. pub(crate) type Perhaps = std::result::Result, Box>; pub trait Gettable { /// Returns current value fn get (&self) -> T; } pub trait Mutable: Gettable { /// Sets new value, returns old fn set (&mut self, value: T) -> T; } pub trait InteriorMutable: Gettable { /// Sets new value, returns old fn set (&self, value: T) -> T; } impl Gettable for AtomicBool { fn get (&self) -> bool { self.load(Relaxed) } } impl InteriorMutable for AtomicBool { fn set (&self, value: bool) -> bool { self.swap(value, Relaxed) } } impl Gettable for AtomicUsize { fn get (&self) -> usize { self.load(Relaxed) } } impl InteriorMutable for AtomicUsize { fn set (&self, value: usize) -> usize { self.swap(value, Relaxed) } } #[cfg(test)] #[test] fn test_time () -> Usually<()> { // TODO! Ok(()) } #[cfg(test)] #[test] fn test_midi_range () { let model = MidiRangeModel::from((1, false)); let _ = model.get_time_len(); let _ = model.get_time_zoom(); let _ = model.get_time_lock(); let _ = model.get_time_start(); let _ = model.get_time_axis(); let _ = model.get_time_end(); let _ = model.get_note_lo(); let _ = model.get_note_axis(); let _ = model.get_note_hi(); }