#![allow(clippy::pedantic)]
#![allow(clippy::cargo)]
use fancy_regex::Regex;
pub fn is_prime(number: usize) -> Result<bool, fancy_regex::Error> {
let re = Regex::new(r"^1?$|^(11+?)\1+$").unwrap();
let possible_prime_match = "1".repeat(number);
match re.is_match(&possible_prime_match) {
Ok(is_prime_bool) => Ok(!is_prime_bool),
Err(err) => Err(err),
}
}
#[cfg(test)]
mod tests {
use crate::is_prime;
#[test]
fn blog_examples() {
assert!(!is_prime(10).unwrap(), "10 is not a prime");
assert!(is_prime(11).unwrap());
assert!(!is_prime(12).unwrap(), "12 is not a prime");
assert!(is_prime(13).unwrap());
assert!(!is_prime(99).unwrap(), "99 is not a prime");
assert!(!is_prime(100).unwrap(), "100 is not a prime");
assert!(is_prime(101).unwrap());
}
#[test]
fn psuedoprimes() {
let psuedoprimes = vec![
9, 15, 21, 25, 27, 33, 35, 39, 45, 49, 51, 55, 57, 63, 65, 69,
];
assert_eq!(
psuedoprimes
.iter()
.map(|x| is_prime(*x).unwrap())
.collect::<Vec<bool>>(),
vec![false; psuedoprimes.len()]
)
}
#[test]
fn large_prime() {
let large_prime: usize = 3010349;
let large_non_prime: usize = 3010350;
assert!(is_prime(large_prime).is_err(), "Stack Overflow");
assert!(is_prime(large_non_prime).is_err(), "Stack Overflow")
}
#[test]
fn prime_loop() {
for n in 0..10000 {
match is_prime(n) {
Ok(bool) => match bool {
true => println!("{} is a prime", n),
false => println!("{} is not a prime", n),
},
Err(_) => {
println!("Limit is: {}", n);
break;
}
}
}
}
}