From e59d19dbf06b91752413e648f33b994f9883c8d5 Mon Sep 17 00:00:00 2001 From: Ludi Rehak Date: Sat, 17 Feb 2024 21:36:14 -0800 Subject: [PATCH] Add compile-time Factorial operation --- src/main.rs | 29 +++++++++++++++++++++++++++++ 1 file changed, 29 insertions(+) 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);