crate-type = ["cdylib", "rlib"]
[features]
-parallel = ["rayon"]
default = ["rand"]
+wasm = ["wasm-bindgen", "getrandom"]
[dependencies]
rand = { version = "0.8.4", optional = true }
rayon = { version = "1.5.1", optional = true }
serde = { version = "1.0", optional = true, features = ["derive"] }
-wasm-bindgen = "0.2.78"
+wasm-bindgen = { version = "0.2.78", optional = true }
+getrandom = { version = "0.2", features = ["js"], optional = true }
#[cfg(feature = "serde")]
use serde::{Deserialize, Serialize};
+#[cfg(feature = "wasm")]
use wasm_bindgen::prelude::*;
#[derive(Debug)]
deck
}
-#[cfg(feature = "random")]
+#[cfg(feature = "rand")]
pub fn shuffle_deck(mut deck: Vec<u32>) -> Vec<u32> {
use rand::prelude::*;
let mut rng = thread_rng();
// }
// }
-#[wasm_bindgen]
+#[cfg_attr(feature = "wasm", wasm_bindgen)]
pub fn parse_cards(s: &str) -> Vec<u32> {
s.trim()
.split_whitespace()
/// assert_eq!(eval_hand(parse_cards("4s 4d 4h 4c 5d")), 140);
/// assert_eq!(eval_hand(parse_cards("Ts 9s 8s 7s 6s 7h 6d")), 5);
/// ```
-#[wasm_bindgen]
+#[cfg_attr(feature = "wasm", wasm_bindgen)]
pub fn eval_hand(cards: Vec<u32>) -> u16 {
match cards.len() {
7 => eval_7hand(&cards.try_into().unwrap()),
/// assert_eq!(eval, 1433);
/// assert_eq!(hand_rank(eval), FLUSH);
/// ```
-#[wasm_bindgen]
+#[cfg_attr(feature = "wasm", wasm_bindgen)]
pub fn hand_rank(i: u16) -> u8 {
match i {
6186..=7462 => HIGH_CARD,
}
}
-#[wasm_bindgen]
+#[cfg_attr(feature = "wasm-bindgen", wasm_bindgen)]
pub fn frequency(i: u8) -> f32 {
EXPECTED_FREQ[i as usize] / 2_598_960.
}
/// Concurrent evaluation of all five-card poker hands using rayon crate.
///
/// This implementation is actually slower in release builds.
-#[cfg(feature = "parallel")]
+#[cfg(feature = "rayon")]
pub fn concurrent_deck_freq_evaluator(deck: &[u32]) -> [u32; 10] {
use rayon::prelude::*;