#[macro_export]
macro_rules! singleton {
($ty:ty, $value:expr) => {{
static VALUE: $crate::once_cell::sync::Lazy<$ty> =
$crate::once_cell::sync::Lazy::new(|| $value);
&*VALUE
}};
}
#[macro_export]
macro_rules! sub_impl {
($a:ident - $b:ident -> $c:ident) => {
impl ::core::ops::Sub<$b> for $a {
type Output = $c;
fn sub(self, other: $b) -> $c {
self + -other
}
}
};
}
#[macro_export]
macro_rules! assign_impl {
($a:ident += $b:ident) => {
impl ::core::ops::AddAssign<$b> for $a {
fn add_assign(&mut self, other: $b) {
*self = *self + other;
}
}
};
($a:ident -= $b:ident) => {
impl ::core::ops::SubAssign<$b> for $a {
fn sub_assign(&mut self, other: $b) {
*self = *self - other;
}
}
};
($a:ident *= $b:ident) => {
impl ::core::ops::MulAssign<$b> for $a {
fn mul_assign(&mut self, other: $b) {
*self = *self * other;
}
}
};
($a:ident /= $b:ident) => {
impl ::core::ops::DivAssign<$b> for $a {
fn div_assign(&mut self, other: $b) {
*self = *self / other;
}
}
};
}