diff --git a/Cargo.lock b/Cargo.lock index 1ea8b8e..db4a39b 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -2724,6 +2724,10 @@ version = "1.70.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "f8478577c03552c21db0e2724ffb8986a5ce7af88107e6be5d2ee6e158c12800" +[[package]] +name = "iter-prod" +version = "0.1.0" + [[package]] name = "itertools" version = "0.10.5" diff --git a/Cargo.toml b/Cargo.toml index 0b03032..2e3fc13 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -30,9 +30,11 @@ members = [ "members/arithmetics", "members/egui-demo", "members/rfd-demo", + "members/iter-prod", ] default-members = [ ".", + "members/iter-prod", "members/rfd-demo", "members/egui-demo", "members/arithmetics", diff --git a/members/iter-prod/Cargo.toml b/members/iter-prod/Cargo.toml new file mode 100644 index 0000000..366207d --- /dev/null +++ b/members/iter-prod/Cargo.toml @@ -0,0 +1,6 @@ +[package] +name = "iter-prod" +version = "0.1.0" +edition = "2021" + +[dependencies] diff --git a/members/iter-prod/src/main.rs b/members/iter-prod/src/main.rs new file mode 100644 index 0000000..c4e25e9 --- /dev/null +++ b/members/iter-prod/src/main.rs @@ -0,0 +1,35 @@ +fn main() { + let x = 7; + println!("{}", factorial(x)); +} + +fn factorial(n: u128) -> u128 { + (1..n + 1).product() +} + +// does the same as product from the stdlib +#[allow(dead_code)] +fn myprod(iter: T) -> u128 +where + T: Iterator, +{ + #[allow(clippy::unnecessary_fold)] // clippy detects that this is just Iter::product + iter.fold(1, |acc, v| acc * v) +} + +#[cfg(test)] +mod tests { + use super::*; + #[test] + fn works() { + assert_eq!(factorial(7), 5040); + assert_eq!(factorial(9), 362880); + } + + #[test] + fn myprod_same_as_real() { + assert_eq!((1..5).product::(), myprod(1..5)); + assert_eq!((1..30).product::(), myprod(1..30)); + // assert_eq!((1..50).product::(), myprod(1..50)); // u128 overflows here + } +}