Skip to content

Commit 93f8e65

Browse files
committed
scala tweaks while reviewing swiss scoring
1 parent 720a697 commit 93f8e65

File tree

2 files changed

+25
-37
lines changed

2 files changed

+25
-37
lines changed

modules/swiss/src/main/SwissScoring.scala

+10-17
Original file line numberDiff line numberDiff line change
@@ -24,39 +24,34 @@ final private class SwissScoring(mongo: SwissMongo)(using
2424
private def recompute(id: SwissId): Fu[Option[SwissScoring.Result]] =
2525
mongo.swiss.byId[Swiss](id) flatMap {
2626
_.so { swiss =>
27-
for {
27+
for
2828
(prevPlayers, pairings) <- fetchPlayers(swiss) zip fetchPairings(swiss)
2929
pairingMap = SwissPairing.toMap(pairings)
3030
sheets = SwissSheet.many(swiss, prevPlayers, pairingMap)
31-
withPoints = (prevPlayers zip sheets).map { case (player, sheet) =>
31+
withPoints = (prevPlayers zip sheets).map: (player, sheet) =>
3232
player.copy(points = sheet.points)
33-
}
3433
playerMap = withPoints.mapBy(_.userId)
35-
players = withPoints.map { p =>
34+
players = withPoints.map: p =>
3635
val playerPairings = (~pairingMap.get(p.userId)).values
37-
val (tieBreak, perfSum) = playerPairings.foldLeft(0f -> 0f) {
36+
val (tieBreak, perfSum) = playerPairings.foldLeft(0f -> 0f):
3837
case ((tieBreak, perfSum), pairing) =>
3938
val opponent = playerMap.get(pairing opponentOf p.userId)
4039
val opponentPoints = opponent.so(_.points.value)
4140
val result = pairing.resultFor(p.userId)
4241
val newTieBreak = tieBreak + result.fold(opponentPoints / 2) { _ so opponentPoints }
43-
val newPerf = perfSum + opponent.so(_.rating.value) + result.so { win =>
44-
if (win) 500 else -500
45-
}
42+
val newPerf = perfSum + opponent.so(_.rating.value) + result.so: win =>
43+
if win then 500 else -500
4644
newTieBreak -> newPerf
47-
}
4845
p.copy(
4946
tieBreak = Swiss.TieBreak(tieBreak),
5047
performance = playerPairings.nonEmpty option Swiss.Performance(perfSum / playerPairings.size)
5148
).recomputeScore
52-
}
53-
_ <- SwissPlayer.fields { f =>
49+
_ <- SwissPlayer.fields: f =>
5450
prevPlayers
5551
.zip(players)
56-
.withFilter { case (a, b) =>
52+
.withFilter: (a, b) =>
5753
a != b
58-
}
59-
.map { case (_, player) =>
54+
.map: (_, player) =>
6055
mongo.player.update
6156
.one(
6257
$id(player.id),
@@ -68,11 +63,9 @@ final private class SwissScoring(mongo: SwissMongo)(using
6863
)
6964
)
7065
.void
71-
}
7266
.parallel
7367
.void
74-
}
75-
} yield SwissScoring
68+
yield SwissScoring
7669
.Result(
7770
swiss,
7871
players.zip(sheets).sortBy(-_._1.score.value),

modules/swiss/src/main/SwissSheet.scala

+15-20
Original file line numberDiff line numberDiff line change
@@ -41,17 +41,16 @@ private object SwissSheet:
4141
players: List[SwissPlayer],
4242
pairingMap: SwissPairing.PairingMap
4343
): List[SwissSheet] =
44-
players.map { player =>
44+
players.map: player =>
4545
one(swiss, ~pairingMap.get(player.userId), player)
46-
}
4746

4847
def one(
4948
swiss: Swiss,
5049
pairingMap: Map[SwissRoundNumber, SwissPairing],
5150
player: SwissPlayer
5251
): SwissSheet =
53-
SwissSheet {
54-
swiss.allRounds.map { round =>
52+
SwissSheet:
53+
swiss.allRounds.map: round =>
5554
pairingMap get round match
5655
case Some(pairing) =>
5756
pairing.status match
@@ -63,8 +62,6 @@ private object SwissSheet:
6362
case None if player.byes(round) => Bye
6463
case None if round.value == 1 => Late
6564
case None => Absent
66-
}
67-
}
6865

6966
final private class SwissSheetApi(mongo: SwissMongo)(using
7067
Executor,
@@ -76,24 +73,22 @@ final private class SwissSheetApi(mongo: SwissMongo)(using
7673
sort: Bdoc
7774
): Source[(SwissPlayer, Map[SwissRoundNumber, SwissPairing], SwissSheet), ?] =
7875
val readPreference =
79-
if (swiss.finishedAt.exists(_ isBefore nowInstant.minusSeconds(10)))
80-
temporarilyPrimary
76+
if swiss.finishedAt.exists(_ isBefore nowInstant.minusSeconds(10))
77+
then temporarilyPrimary
8178
else ReadPreference.primary
8279
SwissPlayer
83-
.fields { f =>
80+
.fields: f =>
8481
mongo.player.find($doc(f.swissId -> swiss.id)).sort(sort)
85-
}
8682
.cursor[SwissPlayer](readPreference)
8783
.documentSource()
88-
.mapAsync(4) { player =>
89-
SwissPairing.fields { f =>
90-
mongo.pairing.list[SwissPairing](
91-
$doc(f.swissId -> swiss.id, f.players -> player.userId),
92-
readPreference
93-
) dmap { player -> _ }
94-
}
95-
}
96-
.map { (player, pairings) =>
84+
.mapAsync(4): player =>
85+
SwissPairing.fields: f =>
86+
mongo.pairing
87+
.list[SwissPairing](
88+
$doc(f.swissId -> swiss.id, f.players -> player.userId),
89+
readPreference
90+
)
91+
.dmap(player -> _)
92+
.map: (player, pairings) =>
9793
val pairingMap = pairings.mapBy(_.round)
9894
(player, pairingMap, SwissSheet.one(swiss, pairingMap, player))
99-
}

0 commit comments

Comments
 (0)