@idealic/poker-engine
Version:
Poker game engine and hand evaluator
58 lines (48 loc) • 1.89 kB
text/typescript
import { Game } from './Game';
import { Hand } from './Hand';
import { emptyMetric as emptyMetricOriginal, getPokerMetrics } from './stats/metrics';
import { emptyStat as emptyStatOriginal } from './stats/stats';
import { PokerMetrics, StreetStat } from './stats/types';
import { PlayerIdentifier, Street } from './types';
export type { PokerMetrics, StreetStat } from './stats/types';
export * from './types';
export function Stats(stats: Stats.Source): readonly StreetStat[] {
if (Array.isArray(stats)) {
return stats;
}
return Game(stats).stats;
}
export namespace Stats {
export type Source = Game | Hand | StreetStat[];
export type Stats = StreetStat;
export type Metrics = PokerMetrics;
export const emptyMetric = emptyMetricOriginal;
export const emptyStat = emptyStatOriginal;
export const columns = Object.keys(emptyStat) as (keyof StreetStat)[];
let columnNames: string[];
function camelToSnakeCase(str: string) {
return str.replace(/[A-Z]/g, letter => `_${letter.toLowerCase()}`);
}
export function getColumnNames() {
if (!columnNames) {
columnNames = Stats.columns.map(camelToSnakeCase);
}
return columnNames;
}
export function getRows(stats: Stats.Source) {
return Stats(stats).map(stat => {
return Object.values(stat);
});
}
export function forPlayer(game: Game, playerIdentifier: PlayerIdentifier) {
return Stats(game).filter(stat => stat.player === Game.getPlayerName(game, playerIdentifier));
}
export function forPlayerStreet(game: Game, playerIdentifier: PlayerIdentifier, street: Street) {
return Stats(game).find(
stat => stat.player === Game.getPlayerName(game, playerIdentifier) && stat.street === street
);
}
export function aggregate(stats: Stats.Source, groups: ('player' | 'street' | 'venue')[]) {
return getPokerMetrics(Stats(stats), groups);
}
}