forked from lichess-org/lila
-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathmodel.scala
More file actions
45 lines (40 loc) · 1.42 KB
/
model.scala
File metadata and controls
45 lines (40 loc) · 1.42 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
package lila.activity
import alleycats.Zero
import lila.core.rating.{ RatingProg, Score }
object RatingProg:
def add(rp1O: Option[RatingProg], rp2O: Option[RatingProg]): Option[lila.core.rating.RatingProg] =
(rp1O, rp2O) match
case (Some(rp1), Some(rp2)) => Some(rp1.copy(after = rp2.after))
case _ => rp2O.orElse(rp1O)
def make(player: lila.core.game.LightPlayer) =
player.rating.map: rating =>
val newRating = player.ratingDiff.fold(rating)(diff => rating.map(_ + diff.value))
lila.core.rating.RatingProg(rating, newRating)
object Score:
extension (s: Score)
def plus(o: Score): Score =
s.copy(
win = s.win + o.win,
loss = s.loss + o.loss,
draw = s.draw + o.draw,
rp = RatingProg.add(s.rp, o.rp)
)
def make(res: Option[Boolean], rp: Option[RatingProg]): Score =
lila.core.rating.Score(
win = res.has(true).so(1),
loss = res.has(false).so(1),
draw = res.isEmpty.so(1),
rp = rp
)
def make(povs: List[lila.core.game.LightPov]): Score =
povs.foldLeft(summon[Zero[Score]].zero):
case (score, pov) if pov.game.finished =>
score.plus(
make(
res = pov.game.win.map(_ == pov.color),
rp = RatingProg.make(pov.player)
)
)
case (score, _) => score
val empty = lila.core.rating.Score(0, 0, 0, none)
given Zero[Score] = Zero(empty)