open_pql/functions/
straight_board.rs1use super::*;
2
3#[pqlfn(arg, rtn, eval)]
4pub fn straight_board(
5 street: PQLStreet,
6 (game, board): (PQLGame, Board),
7) -> PQLBoolean {
8 let rs = board_ranks(street, board).to_u16();
9
10 match game {
11 PQLGame::Holdem | PQLGame::Omaha => {
12 for bits in ARR_STRAIGHT {
13 if (bits & rs).count_ones() >= 3 {
14 return true;
15 }
16 }
17 }
18
19 PQLGame::ShortDeck => {
20 for bits in ARR_STRAIGHT_SHORT {
21 if (bits & rs).count_ones() >= 3 {
22 return true;
23 }
24 }
25 }
26 }
27
28 false
29}
30
31#[cfg(test)]
32mod tests {
33 use super::*;
34 use crate::*;
35
36 #[quickcheck]
37 fn test_straight_board(hbg: HandBoardGame) -> TestResult {
38 let rs = board_ranks(hbg.street, hbg.board).to_u16();
39
40 let is_straight_board = (match hbg.game {
41 PQLGame::ShortDeck => &ARR_STRAIGHT_SHORT as &[_],
42 _ => &ARR_STRAIGHT as &[_],
43 })
44 .iter()
45 .any(|bits| (bits & rs).count_ones() >= 3);
46
47 TestResult::from_bool(
48 is_straight_board
49 == straight_board(hbg.street, (hbg.game, hbg.board)),
50 )
51 }
52}