UNPKG

@vlad-yakovlev/poker

Version:
47 lines (46 loc) 1.97 kB
import * as R from 'remeda'; import { COMBINATION_LEVEL } from '../types/card.js'; import { getCardValue } from '../utils/getCardValue.js'; import { Subset } from './Subset.js'; export class Combination { level; subset; constructor(level, subset) { this.level = level; this.subset = subset; } /** * Weight of combination. Used for comparing combinations */ get weight() { return (this.level * 1e10 + getCardValue(this.subset.cards[0]) * 1e8 + getCardValue(this.subset.cards[1]) * 1e6 + getCardValue(this.subset.cards[2]) * 1e4 + getCardValue(this.subset.cards[3]) * 1e2 + getCardValue(this.subset.cards[4])); } /** * Get best combination from given cards */ static getBest(cards) { return R.pipe(cards, R.sort((a, b) => b - a), Subset.getSubsets, R.map((subset) => { // prettier-ignore return (Combination.build(COMBINATION_LEVEL.ROYAL_FLUSH, subset.royalFlush) ?? Combination.build(COMBINATION_LEVEL.STRAIGHT_FLUSH, subset.straightFlush) ?? Combination.build(COMBINATION_LEVEL.FOUR_OF_KIND, subset.fourOfKind) ?? Combination.build(COMBINATION_LEVEL.FULL_HOUSE, subset.fullHouse) ?? Combination.build(COMBINATION_LEVEL.FLUSH, subset.flush) ?? Combination.build(COMBINATION_LEVEL.STRAIGHT, subset.straight) ?? Combination.build(COMBINATION_LEVEL.THREE_OF_KIND, subset.threeOfKind) ?? Combination.build(COMBINATION_LEVEL.TWO_PAIR, subset.twoPair) ?? Combination.build(COMBINATION_LEVEL.PAIR, subset.pair) ?? Combination.build(COMBINATION_LEVEL.HIGH_CARD, subset)); }), R.sort((a, b) => a.weight - b.weight), R.last()); } static build(level, subset) { if (subset) { return new Combination(level, subset); } } }