#![allow(dead_code)]
use batch_impl::{batch_impl, batch_impl_only, batch_trait};
struct Frac<T, U> {
positive: bool,
num: T,
denom: U,
}
#[batch_impl(
@num #from_bool{i.into()},
<T: UNum, U: UNum> Frac<T, U> #from_bool{
Frac {
positive: true,
num: T::from_bool(i),
denom: U::from_bool(true),
}
}
)]
trait Num {
fn from_bool(i: bool) -> Self;
}
trait UNum: Num {}
trait INum: Num {
fn positive(&self) -> bool;
}
trait FNum: INum {}
batch_trait! {
UNum: @u*;
INum: [@i*, @f*] {
fn positive(&self) -> bool { *self >= Self::from_bool(false) }
},
<T: UNum, U: UNum> Frac<T, U> {
fn positive(&self) -> bool { self.positive }
};
FNum: @f*
}
#[batch_impl_only(
From<bool>
Frac<*(*@u*)^2>
#from{
Frac {
positive: true,
num: value.into(),
denom: true.into(),
}
}
)]
pub trait From<T>: Sized {
fn from(value: T) -> Self;
}
fn main() {
let f: Frac<u8, u16> = Frac::from(true);
assert_eq!(f.num, 1u8);
assert_eq!(f.denom, 1u16);
assert!(f.positive);
assert_eq!(<u8 as Num>::from_bool(true), 1u8);
assert_eq!(<i32 as Num>::from_bool(false), 0i32);
assert_eq!(<f32 as Num>::from_bool(true), 1.0f32);
assert!(<Frac<u8, u16> as INum>::positive(&f));
assert!(<i32 as INum>::positive(&7i32));
assert!(!<f32 as INum>::positive(&-1.5f32));
assert!(<f64 as INum>::positive(&0.5f64));
println!("36 From<bool> impls + the Num/INum/FNum hierarchy all work");
}