Skip to content

Commit 088f7e9

Browse files
playing cards basics
1 parent 522493b commit 088f7e9

File tree

10 files changed

+80
-68
lines changed

10 files changed

+80
-68
lines changed

libs/playing-cards/src/lib/Card.ts

Lines changed: 10 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,14 @@
11
import { CardName } from "./CardName";
22
import { Suit } from "./Suit";
33

4-
export interface Card {
5-
suit: Suit
6-
value: number
7-
name: CardName
4+
export class Card {
5+
constructor(public name: CardName, public suit: Suit, public value: number) {}
6+
7+
compare(card: Card) {
8+
return compareCard(this, card)
9+
}
10+
}
11+
12+
export function compareCard(a: Card, b: Card) {
13+
return a.value - b.value
814
}

libs/playing-cards/src/lib/Deck.ts

Lines changed: 45 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,13 +1,53 @@
11
import { Card } from "./Card";
22
import { CardName } from "./CardName";
33
import { Suit } from "./Suit";
4-
4+
import shuffle from 'lodash/shuffle'
5+
56
export class Deck {
67
public size: number
7-
constructor(private cards: Array<Card>) {
8+
9+
private constructor(private cards: Array<Card>) {
810
this.size = cards.length
911
}
10-
get(name: CardName, suit: Suit): Card {
11-
return this.cards.find(c => c.name === name && c.suit === suit)
12+
13+
static getInstance(acesLow = false): Deck {
14+
//https://www.deceptionary.com/aboutsuits.html
15+
const suitsInOrder: Array<Suit> = [
16+
"Spades", "Hearts", "Clubs", "Diamonds",
17+
]
18+
const standardNameOrder: Array<CardName> = [
19+
'Two', 'Three', 'Four', 'Five',
20+
'Six', 'Seven', 'Eight', 'Nine',
21+
'Ten', 'Jack', 'Queen', 'King',
22+
]
23+
const cardNamesInOrder: Array<CardName> = (acesLow) ? ["Ace", ...standardNameOrder] : [...standardNameOrder, "Ace"]
24+
25+
const overallCardOrder = cardNamesInOrder.reduce<Array<[CardName, Suit]>>((order, name) => [
26+
...order,
27+
...suitsInOrder.map<[CardName, Suit]>(suit => [name, suit])
28+
], [])
29+
30+
const toCard = function ([name, suit]: [CardName, Suit], idx: number): Card {
31+
return new Card(name, suit, idx)
32+
}
33+
34+
const deck: Deck = new Deck(overallCardOrder.map(toCard))
35+
return deck
36+
}
37+
38+
shuffle() {
39+
return shuffle(this.cards)
40+
}
41+
42+
getCard(name: CardName, suit: Suit): Card {
43+
return getCard(name, suit, this.cards)
1244
}
13-
}
45+
}
46+
47+
export function getCard(name: CardName, suit: Suit, cards: Array<Card>) {
48+
return cards.find(c => c.name === name && c.suit === suit)
49+
}
50+
51+
export function shuffle(cards: Array<Card>) {
52+
return shuffle(cards)
53+
}

libs/playing-cards/src/lib/compareCard.ts

Lines changed: 0 additions & 5 deletions
This file was deleted.

libs/playing-cards/src/lib/getDeck.ts

Lines changed: 0 additions & 28 deletions
This file was deleted.
Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,15 @@
1+
import { Deck } from '../Deck'
2+
3+
describe("compareCard", () => {
4+
it('compare number cards', () => {
5+
const deck = Deck.getInstance()
6+
const twoOfHearts = deck.getCard("Two", "Hearts")
7+
const threeOfHearts = deck.getCard("Three", "Hearts")
8+
const lessThanComparison = twoOfHearts.compare(threeOfHearts)
9+
const greaterThanComparison = threeOfHearts.compare(twoOfHearts)
10+
const equalComparison = threeOfHearts.compare(threeOfHearts)
11+
expect(lessThanComparison).toBeLessThan(0)
12+
expect(greaterThanComparison).toBeGreaterThan(0)
13+
expect(equalComparison).toBe(0)
14+
})
15+
})
Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,8 @@
1+
import { Deck } from '../Deck'
2+
3+
describe("Deck", () => {
4+
it('can get instance', () => {
5+
const deck = Deck.getInstance()
6+
expect(deck.size).toBe(52)
7+
})
8+
})

libs/playing-cards/src/lib/test/compareCard.spec.ts

Lines changed: 0 additions & 16 deletions
This file was deleted.

libs/playing-cards/src/lib/test/getDeck.spec.ts

Lines changed: 0 additions & 8 deletions
This file was deleted.

package-lock.json

Lines changed: 1 addition & 2 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

package.json

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,7 @@
99
},
1010
"private": true,
1111
"dependencies": {
12+
"lodash": "^4.17.21",
1213
"tslib": "^2.0.0"
1314
},
1415
"devDependencies": {

0 commit comments

Comments
 (0)