Deck.elm 1.5 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465
  1. module Deck exposing (Deck, DeckSortMethod(..), cmcCurve, decklist, fromDraft)
  2. import Card exposing (CardData)
  3. import Database exposing (Database)
  4. import Draft exposing (Draft)
  5. import List.Extra as List exposing (group)
  6. import Zipper
  7. type alias Deck =
  8. { cards : List CardData }
  9. fromDraft : Bool -> Database -> Draft -> Deck
  10. fromDraft includeWholeDeck db draft =
  11. let
  12. picks =
  13. if includeWholeDeck then
  14. Zipper.toList draft |> List.map .chosen
  15. else
  16. (Zipper.focus draft :: Zipper.left draft) |> List.map .chosen
  17. cards =
  18. List.filterMap (\pick -> Database.get pick.name db) picks
  19. in
  20. { cards = cards }
  21. cmcCurve : Deck -> List ( Int, Int )
  22. cmcCurve deck =
  23. let
  24. maxBucket =
  25. 7
  26. cmcs =
  27. deck.cards
  28. |> List.map (.details >> .cmc)
  29. in
  30. (List.range 0 maxBucket
  31. |> List.map (\cmc -> ( cmc, List.count (\x -> x == cmc) cmcs ))
  32. )
  33. ++ [ ( maxBucket, List.count (\x -> x >= maxBucket) cmcs ) ]
  34. type DeckSortMethod
  35. = SortByPickNumber
  36. | SortByName
  37. | SortByCMC
  38. decklist : DeckSortMethod -> Deck -> List CardData
  39. decklist sortBy deck =
  40. case sortBy of
  41. SortByPickNumber ->
  42. -- Pick order is default sort order
  43. deck.cards
  44. SortByName ->
  45. deck.cards
  46. |> List.sortBy (.details >> .name)
  47. SortByCMC ->
  48. deck.cards
  49. |> List.sortBy (.details >> .cmc)