Skip to content

Commit

Permalink
store players by their ID
Browse files Browse the repository at this point in the history
  • Loading branch information
BrianHicks committed Apr 5, 2021
1 parent fa58353 commit 38a8ea0
Show file tree
Hide file tree
Showing 3 changed files with 37 additions and 27 deletions.
34 changes: 19 additions & 15 deletions src/League.elm
Expand Up @@ -14,17 +14,18 @@ module League exposing
-}

import Dict exposing (Dict)
import Dict as ComparableDict
import Elo
import Json.Decode as Decode exposing (Decoder)
import Json.Encode as Encode
import Player exposing (Player)
import Player exposing (Player, PlayerId)
import Random exposing (Generator)
import Sort.Dict as Dict exposing (Dict)


type League
= League
{ players : Dict String Player
{ players : Dict PlayerId Player
, currentMatch : Maybe Match
}

Expand All @@ -40,7 +41,7 @@ type Match
init : League
init =
League
{ players = Dict.empty
{ players = Dict.empty Player.idSorter
, currentMatch = Nothing
}

Expand All @@ -58,15 +59,18 @@ decoder =
[ playersDecoder
, -- old format: only players as a dict
Decode.dict Player.decoder
|> Decode.map ComparableDict.toList
|> Decode.map (List.map (\( _, player ) -> ( player.id, player )))
|> Decode.map (Dict.fromList Player.idSorter)
]
)


playersDecoder : Decoder (Dict String Player)
playersDecoder : Decoder (Dict PlayerId Player)
playersDecoder =
Decode.field "players" (Decode.list Player.decoder)
|> Decode.map (List.map (\player -> ( player.name, player )))
|> Decode.map Dict.fromList
|> Decode.map (List.map (\player -> ( player.id, player )))
|> Decode.map (Dict.fromList Player.idSorter)


encode : League -> Encode.Value
Expand All @@ -85,9 +89,9 @@ players (League league) =
Dict.values league.players


getPlayer : String -> League -> Maybe Player
getPlayer name (League league) =
Dict.get name league.players
getPlayer : PlayerId -> League -> Maybe Player
getPlayer id (League league) =
Dict.get id league.players


addPlayer : Player -> League -> League
Expand All @@ -101,20 +105,20 @@ addPlayer player (League league) =
nonEmpty ->
List.sum nonEmpty // List.length nonEmpty
in
League { league | players = Dict.insert player.name (Player.setRating initialRating player) league.players }
League { league | players = Dict.insert player.id (Player.setRating initialRating player) league.players }


{-| -}
updatePlayer : Player -> League -> League
updatePlayer player (League league) =
League { league | players = Dict.insert player.name player league.players }
League { league | players = Dict.insert player.id player league.players }


retirePlayer : Player -> League -> League
retirePlayer player (League league) =
League
{ league
| players = Dict.remove player.name league.players
| players = Dict.remove player.id league.players
, currentMatch =
case league.currentMatch of
Nothing ->
Expand Down Expand Up @@ -231,8 +235,8 @@ startMatch (Match playerA playerB) (League league) =
-- don't start a match with players that aren't in the
-- league...
Maybe.map2 Tuple.pair
(Dict.get playerA.name league.players)
(Dict.get playerB.name league.players)
(Dict.get playerA.id league.players)
(Dict.get playerB.id league.players)
|> Maybe.andThen
(\( gotA, gotB ) ->
-- ... or when the players are the same player
Expand Down
8 changes: 7 additions & 1 deletion src/Player.elm
@@ -1,9 +1,10 @@
module Player exposing (Player, PlayerId, decoder, encode, incrementMatchesPlayed, init, playerIdFromIntForTestOnly, setRating)
module Player exposing (Player, PlayerId, decoder, encode, idSorter, incrementMatchesPlayed, init, playerIdFromIntForTestOnly, setRating)

import Elo
import Json.Decode as Decode exposing (Decoder)
import Json.Encode as Encode exposing (Value)
import Murmur3
import Sort exposing (Sorter)


type PlayerId
Expand All @@ -15,6 +16,11 @@ playerIdFromIntForTestOnly =
PlayerId


idSorter : Sorter PlayerId
idSorter =
Sort.by (\(PlayerId id) -> id) Sort.increasing


type alias Player =
{ id : PlayerId
, name : String
Expand Down
22 changes: 11 additions & 11 deletions tests/LeagueTest.elm
Expand Up @@ -89,10 +89,10 @@ startMatchTests =
\playerA playerB ->
let
uniqueA =
{ playerA | name = "real " ++ playerA.name }
Player.init ("real " ++ playerA.name)

uniqueB =
{ playerB | name = "fake " ++ playerB.name }
Player.init ("real " ++ playerB.name)
in
League.init
|> League.addPlayer uniqueA
Expand All @@ -103,7 +103,7 @@ startMatchTests =
\playerA playerBMaybeSame ->
let
playerB =
{ playerBMaybeSame | name = "unique " ++ playerBMaybeSame.name }
Player.init ("unique " ++ playerBMaybeSame.name)
in
League.init
|> League.addPlayer playerA
Expand Down Expand Up @@ -141,10 +141,10 @@ finishMatchTests =
|> League.startMatch (Match winner dummy)
|> League.finishMatch (Win { won = winner, lost = dummy })
|> Expect.all
[ League.getPlayer winner.name
[ League.getPlayer winner.id
>> Maybe.map .matches
>> Expect.equal (Just (winner.matches + 1))
, League.getPlayer dummy.name
, League.getPlayer dummy.id
>> Maybe.map .matches
>> Expect.equal (Just (dummy.matches + 1))
]
Expand All @@ -162,10 +162,10 @@ finishMatchTests =
|> League.startMatch (Match winner dummy)
|> League.finishMatch (Win { won = winner, lost = dummy })
|> Expect.all
[ League.getPlayer winner.name
[ League.getPlayer winner.id
>> Maybe.map .rating
>> Expect.equal (Just newRatings.won)
, League.getPlayer dummy.name
, League.getPlayer dummy.id
>> Maybe.map .rating
>> Expect.equal (Just newRatings.lost)
]
Expand All @@ -188,10 +188,10 @@ finishMatchTests =
|> League.startMatch (Match player dummy)
|> League.finishMatch (Draw { playerA = player, playerB = dummy })
|> Expect.all
[ League.getPlayer player.name
[ League.getPlayer player.id
>> Maybe.map .matches
>> Expect.equal (Just (player.matches + 1))
, League.getPlayer dummy.name
, League.getPlayer dummy.id
>> Maybe.map .matches
>> Expect.equal (Just (dummy.matches + 1))
]
Expand All @@ -217,10 +217,10 @@ finishMatchTests =
|> League.startMatch (Match player dummy)
|> League.finishMatch (Draw { playerA = player, playerB = dummy })
|> Expect.all
[ League.getPlayer player.name
[ League.getPlayer player.id
>> Maybe.map .rating
>> Expect.equal (Just newRatings.playerA)
, League.getPlayer dummy.name
, League.getPlayer dummy.id
>> Maybe.map .rating
>> Expect.equal (Just newRatings.playerB)
]
Expand Down

0 comments on commit 38a8ea0

Please sign in to comment.