desck 0.4.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/src/Deck.elm ADDED
@@ -0,0 +1,571 @@
1
+ module Deck exposing (..)
2
+
3
+ import Json.Decode as D exposing (Decoder)
4
+ import Json.Encode exposing (Value, string)
5
+ import Ordering exposing (Ordering)
6
+
7
+
8
+ jokerCardOrdering : Ordering CardModel
9
+ jokerCardOrdering =
10
+ Ordering.byRank
11
+ (\card ->
12
+ case card of
13
+ Ranked _ _ ->
14
+ 1
15
+
16
+ Joker _ ->
17
+ 2
18
+ )
19
+ (\x y ->
20
+ case ( x, y ) of
21
+ ( Ranked v1 s1, Ranked v2 s2 ) ->
22
+ suitOrdering s1 s2
23
+ |> Ordering.ifStillTiedThen
24
+ (valueOrdering v1 v2)
25
+
26
+ _ ->
27
+ Ordering.noConflicts
28
+ )
29
+
30
+
31
+ suitOrdering : Ordering Suit
32
+ suitOrdering =
33
+ Ordering.explicit [ Club, Heart, Diamond, Spade ]
34
+
35
+
36
+ valueOrdering : Ordering Rank
37
+ valueOrdering =
38
+ Ordering.explicit
39
+ [ Ace
40
+ , Two
41
+ , Three
42
+ , Four
43
+ , Five
44
+ , Six
45
+ , Seven
46
+ , Eight
47
+ , Nine
48
+ , Ten
49
+ , Jack
50
+ , Queen
51
+ , King
52
+ ]
53
+
54
+
55
+ type Orientation
56
+ = Up
57
+ | Side
58
+
59
+
60
+ type Suit
61
+ = Spade
62
+ | Heart
63
+ | Diamond
64
+ | Club
65
+
66
+
67
+ type Rank
68
+ = Ace
69
+ | Two
70
+ | Three
71
+ | Four
72
+ | Five
73
+ | Six
74
+ | Seven
75
+ | Eight
76
+ | Nine
77
+ | Ten
78
+ | Jack
79
+ | Queen
80
+ | King
81
+
82
+
83
+ type CardModel
84
+ = Ranked Rank Suit
85
+ | Joker Bool
86
+
87
+
88
+ suitFromInt : Int -> Suit
89
+ suitFromInt i =
90
+ case i of
91
+ 0 ->
92
+ Spade
93
+
94
+ 1 ->
95
+ Heart
96
+
97
+ 2 ->
98
+ Diamond
99
+
100
+ _ ->
101
+ Club
102
+
103
+
104
+ suitAsUnicode : Suit -> String
105
+ suitAsUnicode s =
106
+ case s of
107
+ Spade ->
108
+ "♠"
109
+
110
+ Heart ->
111
+ "♥"
112
+
113
+ Diamond ->
114
+ "♦"
115
+
116
+ Club ->
117
+ "♣"
118
+
119
+
120
+ suitAsString : Suit -> String
121
+ suitAsString s =
122
+ case s of
123
+ Spade ->
124
+ "spade"
125
+
126
+ Heart ->
127
+ "heart"
128
+
129
+ Diamond ->
130
+ "diamond"
131
+
132
+ Club ->
133
+ "club"
134
+
135
+
136
+ maybeSuit : CardModel -> Maybe Suit
137
+ maybeSuit m =
138
+ case m of
139
+ Ranked _ suit ->
140
+ Just suit
141
+
142
+ Joker _ ->
143
+ Nothing
144
+
145
+
146
+ maybeRank : CardModel -> Maybe Rank
147
+ maybeRank m =
148
+ case m of
149
+ Ranked rank _ ->
150
+ Just rank
151
+
152
+ Joker _ ->
153
+ Nothing
154
+
155
+
156
+ suitFromString : String -> Maybe Suit
157
+ suitFromString s =
158
+ case s of
159
+ "spade" ->
160
+ Just Spade
161
+
162
+ "heart" ->
163
+ Just Heart
164
+
165
+ "diamond" ->
166
+ Just Diamond
167
+
168
+ "club" ->
169
+ Just Club
170
+
171
+ _ ->
172
+ Nothing
173
+
174
+
175
+ suitAsChar : Suit -> String
176
+ suitAsChar s =
177
+ suitAsString s
178
+ |> String.left 1
179
+ |> String.toLower
180
+
181
+
182
+ suits : List Suit
183
+ suits =
184
+ [ Spade, Heart, Diamond, Club ]
185
+
186
+
187
+ ranks : List Rank
188
+ ranks =
189
+ [ Ace, Two, Three, Four, Five, Six, Seven, Eight, Nine, Ten, Jack, Queen, King ]
190
+
191
+
192
+ rankFromInt : Int -> Rank
193
+ rankFromInt i =
194
+ case i of
195
+ 1 ->
196
+ Ace
197
+
198
+ 2 ->
199
+ Two
200
+
201
+ 3 ->
202
+ Three
203
+
204
+ 4 ->
205
+ Four
206
+
207
+ 5 ->
208
+ Five
209
+
210
+ 6 ->
211
+ Six
212
+
213
+ 7 ->
214
+ Seven
215
+
216
+ 8 ->
217
+ Eight
218
+
219
+ 9 ->
220
+ Nine
221
+
222
+ 10 ->
223
+ Ten
224
+
225
+ 11 ->
226
+ Jack
227
+
228
+ 12 ->
229
+ Queen
230
+
231
+ _ ->
232
+ King
233
+
234
+
235
+ rankAsInt : Rank -> Int
236
+ rankAsInt r =
237
+ case r of
238
+ Ace ->
239
+ 1
240
+
241
+ Two ->
242
+ 2
243
+
244
+ Three ->
245
+ 3
246
+
247
+ Four ->
248
+ 4
249
+
250
+ Five ->
251
+ 5
252
+
253
+ Six ->
254
+ 6
255
+
256
+ Seven ->
257
+ 7
258
+
259
+ Eight ->
260
+ 8
261
+
262
+ Nine ->
263
+ 9
264
+
265
+ Ten ->
266
+ 10
267
+
268
+ Jack ->
269
+ 11
270
+
271
+ Queen ->
272
+ 12
273
+
274
+ King ->
275
+ 13
276
+
277
+
278
+ printRank : CardModel -> String
279
+ printRank m =
280
+ case m of
281
+ Ranked rank _ ->
282
+ case rank of
283
+ Ten ->
284
+ "I0"
285
+
286
+ _ ->
287
+ rankAsString rank |> String.toUpper
288
+
289
+ Joker _ ->
290
+ "★"
291
+
292
+
293
+ rankAsChar : Rank -> String
294
+ rankAsChar r =
295
+ case r of
296
+ Ten ->
297
+ "0"
298
+
299
+ _ ->
300
+ rankAsString r
301
+
302
+
303
+ rankAsString : Rank -> String
304
+ rankAsString r =
305
+ case r of
306
+ Ace ->
307
+ "a"
308
+
309
+ Ten ->
310
+ "10"
311
+
312
+ Jack ->
313
+ "j"
314
+
315
+ Queen ->
316
+ "q"
317
+
318
+ King ->
319
+ "k"
320
+
321
+ _ ->
322
+ rankAsInt r
323
+ |> String.fromInt
324
+
325
+
326
+ parseRank : String -> Maybe Rank
327
+ parseRank r =
328
+ let
329
+ int =
330
+ String.toInt r
331
+
332
+ upper =
333
+ String.toUpper r
334
+ in
335
+ case int of
336
+ Just i ->
337
+ case i of
338
+ 1 ->
339
+ Just Ace
340
+
341
+ 2 ->
342
+ Just Two
343
+
344
+ 3 ->
345
+ Just Three
346
+
347
+ 4 ->
348
+ Just Four
349
+
350
+ 5 ->
351
+ Just Five
352
+
353
+ 6 ->
354
+ Just Six
355
+
356
+ 7 ->
357
+ Just Seven
358
+
359
+ 8 ->
360
+ Just Eight
361
+
362
+ 9 ->
363
+ Just Nine
364
+
365
+ 10 ->
366
+ Just Ten
367
+
368
+ 0 ->
369
+ Just Ten
370
+
371
+ _ ->
372
+ Nothing
373
+
374
+ Nothing ->
375
+ case upper of
376
+ "J" ->
377
+ Just Jack
378
+
379
+ "Q" ->
380
+ Just Queen
381
+
382
+ "K" ->
383
+ Just King
384
+
385
+ "A" ->
386
+ Just Ace
387
+
388
+ _ ->
389
+ Nothing
390
+
391
+
392
+ parseSuit : String -> Maybe Suit
393
+ parseSuit s =
394
+ case String.toUpper s of
395
+ "S" ->
396
+ Just Spade
397
+
398
+ "D" ->
399
+ Just Diamond
400
+
401
+ "C" ->
402
+ Just Club
403
+
404
+ "H" ->
405
+ Just Heart
406
+
407
+ _ ->
408
+ Nothing
409
+
410
+
411
+ isJust : Maybe a -> Bool
412
+ isJust m =
413
+ case m of
414
+ Just _ ->
415
+ True
416
+
417
+ Nothing ->
418
+ False
419
+
420
+
421
+ parseCard : List Char -> List CardModel
422
+ parseCard chars =
423
+ let
424
+ mrank c =
425
+ parseRank <| String.fromChar c
426
+
427
+ msuit c =
428
+ parseSuit <| String.fromChar c
429
+ in
430
+ case chars of
431
+ [] ->
432
+ []
433
+
434
+ [ c ] ->
435
+ case mrank c of
436
+ Just rank ->
437
+ List.map (\suit -> Ranked rank suit) suits
438
+
439
+ Nothing ->
440
+ if c == 'x' then
441
+ [ Joker True, Joker False ]
442
+
443
+ else
444
+ case msuit c of
445
+ Just suit ->
446
+ List.map (\rank -> Ranked rank suit) ranks
447
+ |> List.reverse
448
+
449
+ Nothing ->
450
+ []
451
+
452
+ [ a, b ] ->
453
+ case ( mrank a, msuit b ) of
454
+ ( Just rank, Just suit ) ->
455
+ [ Ranked rank suit ]
456
+
457
+ _ ->
458
+ case ( a, b ) of
459
+ ( 'x', 'r' ) ->
460
+ [ Joker True ]
461
+
462
+ ( 'x', 'b' ) ->
463
+ [ Joker False ]
464
+
465
+ _ ->
466
+ []
467
+
468
+ _ ->
469
+ []
470
+
471
+
472
+ parseCards : String -> List CardModel
473
+ parseCards s =
474
+ if s == "all" then
475
+ parseDeck "c d h s"
476
+
477
+ else
478
+ let
479
+ words =
480
+ String.split " " s
481
+ |> List.map String.toList
482
+ in
483
+ List.map parseCard words
484
+ |> List.concat
485
+
486
+
487
+ parseDeck : String -> List CardModel
488
+ parseDeck s =
489
+ s |> String.words |> List.map parseCards |> List.reverse |> List.concat
490
+
491
+
492
+ suitAsColor : Suit -> String
493
+ suitAsColor s =
494
+ case s of
495
+ Spade ->
496
+ "black"
497
+
498
+ Club ->
499
+ "black"
500
+
501
+ _ ->
502
+ "red"
503
+
504
+
505
+ modelAsColor : CardModel -> String
506
+ modelAsColor m =
507
+ case m of
508
+ Ranked _ suit ->
509
+ suitAsColor suit
510
+
511
+ Joker isRed ->
512
+ if isRed then
513
+ "red"
514
+
515
+ else
516
+ "black"
517
+
518
+
519
+ modelAsShort : CardModel -> String
520
+ modelAsShort m =
521
+ case m of
522
+ Ranked rank suit ->
523
+ rankAsChar rank ++ suitAsChar suit
524
+
525
+ Joker red ->
526
+ "x"
527
+ ++ (if red then
528
+ "r"
529
+
530
+ else
531
+ "b"
532
+ )
533
+
534
+
535
+ defaultModel : CardModel
536
+ defaultModel =
537
+ Ranked Ace Spade
538
+
539
+
540
+ modelUsing : CardModel -> List String
541
+ modelUsing m =
542
+ case m of
543
+ Ranked rank suit ->
544
+ [ modelAsShort m
545
+ , rankAsChar rank
546
+ , suitAsString suit
547
+ ]
548
+
549
+ Joker _ ->
550
+ [ modelAsShort m
551
+ , "x"
552
+ ]
553
+
554
+
555
+ modelDecoder : Decoder CardModel
556
+ modelDecoder =
557
+ D.string
558
+ |> D.andThen
559
+ (\str ->
560
+ case List.head <| parseCards str of
561
+ Just card ->
562
+ D.succeed card
563
+
564
+ Nothing ->
565
+ D.fail ""
566
+ )
567
+
568
+
569
+ encodeModel : CardModel -> Value
570
+ encodeModel m =
571
+ string <| modelAsShort m