diff --git a/src/main.rs b/src/main.rs index 58bed50..10e0ee5 100644 --- a/src/main.rs +++ b/src/main.rs @@ -130,6 +130,26 @@ where type Product = <(Succ, <(T, Succ) as Mul>::Product) as Add>::Sum; } +// Factorial + +trait Factorial { + type Result; +} + +// Base case: 0! = 1 +impl Factorial for Zero { + type Result = Succ; +} + +impl Factorial for Succ +where + T: Factorial, + (Succ, T::Result): Mul, +{ + // n! = n * (n-1)! + type Result = <(Succ, T::Result) as Mul>::Product; +} + // Division trait GreaterThanEq { @@ -229,6 +249,15 @@ mod tests { assert_eq!(<(encode!(**), encode!(***)) as Mul>::Product::VALUE, 6); } + #[test] + fn factorial() { + assert_eq!(::Result::VALUE, 1); + assert_eq!(::Result::VALUE, 1); + assert_eq!(::Result::VALUE, 2); + assert_eq!(::Result::VALUE, 6); + assert_eq!(::Result::VALUE, 24); + } + #[test] fn greater_than_eq() { assert_eq!(<(encode!(), encode!()) as GreaterThanEq>::Greater::VALUE, 1);