const suits = ["heart", "diamond", "spade", "club"] as const; export type Suit = (typeof suits)[number]; const ranks = [ 2, 3, 4, 5, 6, 7, 8, 9, 10, "jack", "queen", "king", "ace", ] as const; export type Rank = (typeof ranks)[number]; export type Card = | { kind: "normal"; suit: Suit; rank: Rank; } | { kind: "joker"; color: "red" | "black" }; export type vCard = Card | null | number; export type Pile = C[]; export type Stack = C[]; export type Hand = C[]; export type Board = C[]; export const newDeck = (withJokers = false): Pile => suits .map((suit) => ranks.map((rank) => ({ kind: "normal", suit, rank } as Card)) ) .flat() .concat( withJokers ? [ { kind: "joker", color: "red" }, { kind: "joker", color: "black" }, ] : [] ); export const shuffle = (cards: Card[]) => { let i = cards.length; while (i > 0) { const j = Math.floor(Math.random() * i); i--; [cards[i], cards[j]] = [cards[j], cards[i]]; } return cards; };