# `poker`: The Poker Evaluation Crate
[](https://crates.io/crates/poker)
[](https://docs.rs/poker)
[](https://github.com/rust-secure-code/safety-dance/)
`poker` is a Rust crate for the speedy evaluation of poker hands. It it based on
the [`treys`](https://github.com/ihendley/treys)
Python package and the algorithms found within, with mild adaptations and some
personal touches to try to make it as idiomatic as possible in Rust.
```rust
use poker::{Evaluator, cards, Card};
fn main() {
// Create a hand evaluator
let eval = Evaluator::new();
// Generate a shuffled deck
let mut deck = Card::generate_shuffled_deck().to_vec();
// Deal a hand
let hand: Vec<Card> = deck.drain(..5).collect();
// Evaluate
let result = eval.evaluate(hand).expect("Couldn't evaluate hand!");
// Print the hand result
println!("{}", result);
}
```
## Using `poker`
Add poker to the `dependencies` in your `Cargo.toml` file:
```toml
[dependencies]
poker = "0.3"
```
## Features
`poker` currently has two features. One depends on the [`rand`](https://crates.io/crates/rand) crate,
in order to shuffle generated decks. This is enabled by default.
The second feature, which is also not enabled by default is `static_lookup`. Enabling
this feature opens up the `poker::evaluate::static_lookup` module, which contains
the free `evauluate` function. It works similar to `Evaluator::evaluate`, but
semantically it uses a static data structure that does not rely on heap allocations.
There is no real benefit to using the feature yet, but it is an experimental first step
for possible `no_std` support in the future. To enable this feature:
```toml
[dependencies]
# To use without `rand`, add `default-features = false`
poker = { version = "0.3", features = ["static_lookup"] }
```
## A Note on Performance
For readability, the `#[inline]` attribute has been removed from function
declarations. In order to ensure `rustc` can make appropriate inlining and
optimization decisions, remember to use link-time optimization in your release
builds. This comes at the cost of slower compilation times. In your
`Cargo.toml`:
```toml
[profile.release]
# ...
lto = true # the default is false!
```
## Examples
`poker` includes two fun builtin examples: `poker-repl` and `jacks-or-better`.
`poker-repl` is a `repl`-like environment when you can evaluate different poker
hands. `jacks-or-better` is a terminal re-creation of the Jacks or Better
video poker game. Payouts based on [this image](https://www.gamblingsites.com/wp-content/uploads/2016/08/video-poker-pay-table-jacks-or-better.png).
Rules for the game can be found [here](https://www.onlinepoker.net/games/jacks-or-better).
> ### DISCLAIMER
>
> The `jacks-or-better` example from the `poker` crate has themes of gambling
> using a currency called `credits`. This program is meant for example purposes
> only to illustrate one possible use of this library. There is no risk associated
> with running the example as it can be terminated and restarted at any time.
>
> Please be aware of the possible financial risk of real gambling.
You can install these examples through `cargo` by running the following command:
```bash
cargo install poker --example=poker-repl
cargo install poker --example=jacks-or-better
# Then you can run the programs, assuming they were installed somewhere in $PATH
poker-repl
jacks-or-better
```
You can also run the examples through a cloned git repository.
```bash
git clone https://github.com/deus-x-mackina/poker.git
cd poker
cargo run --example=poker-repl
cargo run --example=jacks-or-better
```
## License
Licensed under the MIT license ([LICENSE.txt](LICENSE.txt) or <http://opensource.org/licenses/MIT>).