diff --git a/app/ai/Ai.scala b/app/ai/Ai.scala
index 8ebd8164b7..d079b5a3e4 100644
--- a/app/ai/Ai.scala
+++ b/app/ai/Ai.scala
@@ -5,7 +5,7 @@ import chess.{ Game, Move }
import game.DbGame
import analyse.Analysis
-import akka.dispatch.Future
+import scala.concurrent.Future
trait Ai {
diff --git a/app/ai/Client.scala b/app/ai/Client.scala
index 1ecf798194..a0d8f145b5 100644
--- a/app/ai/Client.scala
+++ b/app/ai/Client.scala
@@ -2,7 +2,8 @@ package lila
package ai
import scalaz.effects._
-import akka.dispatch.Future
+import scala.concurrent.Future
+import play.api.libs.concurrent.execution.Implicits._
trait Client extends Ai {
@@ -36,7 +37,7 @@ trait Client extends Ai {
ping = p
}
- private def isHealthy(p: Option[Int]) = p.fold(isFast, false)
+ private def isHealthy(p: Option[Int]) = p.fold(false)(isFast)
private def isFast(p: Int) = p < pingAlert
}
diff --git a/app/ai/StupidAi.scala b/app/ai/StupidAi.scala
index 85b54c5374..9f184d7206 100644
--- a/app/ai/StupidAi.scala
+++ b/app/ai/StupidAi.scala
@@ -5,7 +5,7 @@ import chess.{ Game, Move }
import game.DbGame
import scalaz.effects._
-import akka.dispatch.Future
+import scala.concurrent.Future
final class StupidAi extends Ai with core.Futuristic {
diff --git a/app/ai/stockfish/Ai.scala b/app/ai/stockfish/Ai.scala
index 252a831d57..3bb60b0767 100644
--- a/app/ai/stockfish/Ai.scala
+++ b/app/ai/stockfish/Ai.scala
@@ -7,9 +7,10 @@ import game.DbGame
import analyse.Analysis
import scalaz.effects._
-import akka.dispatch.Future
+import scala.concurrent.Future
import play.api.Play.current
import play.api.libs.concurrent._
+import play.api.libs.concurrent.execution.Implicits._
final class Ai(server: Server) extends lila.ai.Ai with Stockfish {
diff --git a/app/ai/stockfish/Client.scala b/app/ai/stockfish/Client.scala
index 9d2f96eaf3..112199da3a 100644
--- a/app/ai/stockfish/Client.scala
+++ b/app/ai/stockfish/Client.scala
@@ -8,10 +8,11 @@ import game.DbGame
import analyse.Analysis
import scalaz.effects._
-import akka.dispatch.Future
+import scala.concurrent.Future
import scala.concurrent.duration._
import play.api.Play.current
import play.api.libs.concurrent._
+import play.api.libs.concurrent.execution.Implicits._
import play.api.libs.ws.WS
final class Client(
@@ -38,26 +39,17 @@ final class Client(
}
private def fetchMove(pgn: String, initialFen: String, level: Int): Future[String] =
- toAkkaFuture(WS.url(playUrl).withQueryString(
+ WS.url(playUrl).withQueryString(
"pgn" -> pgn,
"initialFen" -> initialFen,
"level" -> level.toString
- ).get() map (_.body))
+ ).get() map (_.body)
private def fetchAnalyse(pgn: String, initialFen: String): Future[String] =
- toAkkaFuture(WS.url(analyseUrl).withQueryString(
+ WS.url(analyseUrl).withQueryString(
"pgn" -> pgn,
"initialFen" -> initialFen
- ).get() map (_.body))
+ ).get() map (_.body)
private implicit val executor = Akka.system.dispatcher
-
- private def toAkkaFuture[A](promise: Promise[A]): Future[A] = {
- val p = akka.dispatch.Promise[A]()
- promise extend1 {
- case Redeemed(value) ⇒ p success value
- case Thrown(exn) ⇒ p failure exn
- }
- p.future
- }
}
diff --git a/app/ai/stockfish/Config.scala b/app/ai/stockfish/Config.scala
index 636c985316..13ae143946 100644
--- a/app/ai/stockfish/Config.scala
+++ b/app/ai/stockfish/Config.scala
@@ -44,7 +44,7 @@ final class Config(settings: Settings) {
setoption("OwnBook", true),
"isready"))
- def go(task: Task) = task.fold(
+ def go(task: Task): List[String] = task.fold(
play ⇒ List(
position(play.fen, play.moves),
"go movetime %d%s".format(
@@ -62,7 +62,7 @@ final class Config(settings: Settings) {
private def analyseMoveTime = settings.AiStockfishAnalyseMoveTime
private def position(fen: Option[String], moves: String) =
- "position %s moves %s".format(fen.fold("fen " + _, "startpos"), moves)
+ "position %s moves %s".format(fen.fold("startpos")("fen " + _), moves)
private def setoption(name: String, value: Any) =
"setoption name %s value %s".format(name, value)
diff --git a/app/ai/stockfish/Server.scala b/app/ai/stockfish/Server.scala
index 390735f648..2ec4094307 100644
--- a/app/ai/stockfish/Server.scala
+++ b/app/ai/stockfish/Server.scala
@@ -9,9 +9,8 @@ import analyse.Analysis
import model.{ GetQueueSize, QueueSize }
import akka.util.Timeout
-import scala.concurrent.Duration
import scala.concurrent.duration._
-import akka.dispatch.{ Future, Await }
+import scala.concurrent.{ Future, Await }
import akka.actor.{ Props, Actor, ActorRef, Kill }
import akka.pattern.{ ask, AskTimeoutException }
import play.api.Play.current
@@ -30,7 +29,7 @@ final class Server(
} yield play).fold(
err ⇒ Future(failure(err)),
play ⇒ actor ? play mapTo bestMoveManifest map { m ⇒
- success(m.move | "")
+ success(~m.move)
} onFailure reboot
)
}
@@ -52,15 +51,15 @@ final class Server(
}
}
- private def chess960Fen(fen: String) = (Forsyth << fen).fold(
- situation ⇒ fen.replace("KQkq", situation.board.pieces.toList filter {
+ private def chess960Fen(fen: String) = (Forsyth << fen).fold(fen) { situation =>
+ fen.replace("KQkq", situation.board.pieces.toList filter {
case (_, piece) ⇒ piece is Rook
} sortBy {
case (pos, _) ⇒ (pos.y, pos.x)
} map {
case (pos, piece) ⇒ piece.color.fold(pos.file.toUpperCase, pos.file)
- } mkString ""),
- fen)
+ } mkString "")
+ }
private val reboot: PartialFunction[Throwable, Unit] = {
case e: AskTimeoutException ⇒ actor ! model.RebootException
diff --git a/app/ai/stockfish/model.scala b/app/ai/stockfish/model.scala
index c4880a8a3f..2cd2781b4f 100644
--- a/app/ai/stockfish/model.scala
+++ b/app/ai/stockfish/model.scala
@@ -26,9 +26,9 @@ object model {
override def toString = getClass.getName + " = " + queue.size
}
case class Todo(queue: Vector[Task] = Vector.empty) extends Data {
- def doing[A](withTask: Doing ⇒ A, without: Todo ⇒ A) = dequeue.fold({
+ def doing[A](withTask: Doing ⇒ A, without: Todo ⇒ A) = dequeue.fold(without(this)) {
case (task, rest) ⇒ withTask(Doing(task, rest))
- }, without(this))
+ }
def fold[A](todo: Todo ⇒ A, doing: Doing ⇒ A): A = todo(this)
def enqueue(task: Task) = copy(queue :+ task)
}
diff --git a/app/analyse/AdvantageChart.scala b/app/analyse/AdvantageChart.scala
index 63c1416a2b..9364967698 100644
--- a/app/analyse/AdvantageChart.scala
+++ b/app/analyse/AdvantageChart.scala
@@ -1,17 +1,18 @@
package lila
package analyse
-import com.codahale.jerkson.Json
+import play.api.libs.json.Json
final class AdvantageChart(advices: Analysis.InfoAdvices) {
val max = 15
- def columns = Json generate List(
- "string" :: "Move" :: Nil,
- "number" :: "Advantage" :: Nil)
+ def columns = Json.arr(
+ Json.arr("string", "Move"),
+ Json.arr("number", "Advantage")
+ )
- def rows = Json generate {
+ def rows = Json.toJson {
val scale = floatBox(-max to max) _
diff --git a/app/analyse/AnalyseEnv.scala b/app/analyse/AnalyseEnv.scala
index 4be10df7b8..d0df5b4d68 100644
--- a/app/analyse/AnalyseEnv.scala
+++ b/app/analyse/AnalyseEnv.scala
@@ -7,7 +7,7 @@ import core.Settings
import com.mongodb.casbah.MongoCollection
import scalaz.effects._
-import akka.dispatch.Future
+import scala.concurrent.Future
final class AnalyseEnv(
settings: Settings,
diff --git a/app/analyse/Analyser.scala b/app/analyse/Analyser.scala
index 0d514de493..35f99dda4d 100644
--- a/app/analyse/Analyser.scala
+++ b/app/analyse/Analyser.scala
@@ -6,7 +6,7 @@ import game.{ DbGame, GameRepo, PgnRepo }
import scalaz.effects._
import play.api.libs.concurrent.Akka
import play.api.Play.current
-import akka.dispatch.Future
+import scala.concurrent.Future
import scala.concurrent.duration._
import akka.util.Timeout
@@ -28,32 +28,29 @@ final class Analyser(
private def getOrGenerateIO(id: String, userId: String, admin: Boolean): Future[Valid[Analysis]] = for {
a ← ioToFuture(analysisRepo doneById id)
- b ← a.fold(
- x ⇒ Future(success(x)),
- for {
- userInProgress ← ioToFuture(admin.fold(
- io(false),
- analysisRepo userInProgress userId
- ))
- gameOption ← ioToFuture(gameRepo game id)
- pgnString ← ioToFuture(pgnRepo get id)
- result ← gameOption.filterNot(_ ⇒ userInProgress).fold(
- game ⇒ for {
- _ ← ioToFuture(analysisRepo.progress(id, userId))
- initialFen ← ioToFuture(gameRepo initialFen id)
- analysis ← generator()(pgnString, initialFen)
- _ ← ioToFuture(analysis.prefixFailuresWith("Analysis").fold(
- fail ⇒ for {
- _ ← putFailures(fail)
- _ ← analysisRepo.fail(id, fail)
- } yield (),
- analysisRepo.done(id, _)
- ))
- } yield analysis,
- Future(!!("No such game " + id): Valid[Analysis])
- )
- } yield result
- )
+ b ← a.fold(for {
+ userInProgress ← ioToFuture(admin.fold(
+ io(false),
+ analysisRepo userInProgress userId
+ ))
+ gameOption ← ioToFuture(gameRepo game id)
+ pgnString ← ioToFuture(pgnRepo get id)
+ result ← gameOption.filterNot(_ ⇒ userInProgress).fold(
+ game ⇒ for {
+ _ ← ioToFuture(analysisRepo.progress(id, userId))
+ initialFen ← ioToFuture(gameRepo initialFen id)
+ analysis ← generator()(pgnString, initialFen)
+ _ ← ioToFuture(analysis.prefixFailuresWith("Analysis").fold(
+ fail ⇒ for {
+ _ ← putFailures(fail)
+ _ ← analysisRepo.fail(id, fail)
+ } yield (),
+ analysisRepo.done(id, _)
+ ))
+ } yield analysis,
+ Future(!!("No such game " + id): Valid[Analysis])
+ )
+ } yield result) { x ⇒ Future(success(x)) }
} yield b
private def ioToFuture[A](ioa: IO[A]) = Future {
diff --git a/app/analyse/Analysis.scala b/app/analyse/Analysis.scala
index c0f664e65a..de59069bc9 100644
--- a/app/analyse/Analysis.scala
+++ b/app/analyse/Analysis.scala
@@ -158,7 +158,7 @@ case class Info(
encode(mate)
) mkString Info.separator
- private def encode(oa: Option[Any]): String = oa.fold(_.toString, "_")
+ private def encode(oa: Option[Any]): String = oa.fold("_")(_.toString)
}
object Info {
diff --git a/app/analyse/AnalysisRepo.scala b/app/analyse/AnalysisRepo.scala
index 52b2abc7c6..e3563e8eaf 100644
--- a/app/analyse/AnalysisRepo.scala
+++ b/app/analyse/AnalysisRepo.scala
@@ -12,14 +12,14 @@ final class AnalysisRepo(val collection: MongoCollection) {
def done(id: String, a: Analysis) = io {
collection.update(
DBObject("_id" -> id),
- $set("done" -> true, "encoded" -> a.encode) ++ $unset("fail")
+ $set(Seq("done" -> true, "encoded" -> a.encode)) ++ $unset(Seq("fail"))
)
}
def fail(id: String, err: Failures) = io {
collection.update(
DBObject("_id" -> id),
- $set("fail" -> err.shows)
+ $set(Seq("fail" -> err.shows))
)
}
diff --git a/app/analyse/Annotator.scala b/app/analyse/Annotator.scala
index 6997c07101..18609d7419 100644
--- a/app/analyse/Annotator.scala
+++ b/app/analyse/Annotator.scala
@@ -25,7 +25,7 @@ object Annotator {
private def makeComment(advice: Advice): String = (advice match {
case CpAdvice(sev, _, _) ⇒ sev.nag.toString
case MateAdvice(sev, _, _) ⇒ sev.desc
- }) ++ makeBestComment(advice).fold(". " + _, ".")
+ }) ++ makeBestComment(advice).fold(".")(". " + _)
private def makeBestComment(advice: Advice): Option[String] =
(advice.info.move != advice.info.best) option {
diff --git a/app/analyse/PgnDump.scala b/app/analyse/PgnDump.scala
index 04e4dba1fd..5e1f979fe0 100644
--- a/app/analyse/PgnDump.scala
+++ b/app/analyse/PgnDump.scala
@@ -2,7 +2,7 @@ package lila
package analyse
import chess.format.Forsyth
-import chess.format.{ pgn => chessPgn }
+import chess.format.{ pgn ⇒ chessPgn }
import chess.format.pgn.{ Pgn, Tag }
import game.{ DbGame, DbPlayer, GameRepo }
import user.{ User, UserRepo }
@@ -21,7 +21,7 @@ final class PgnDump(
ts ← tags(game)
pgnObj = Pgn(ts, turns(pgn))
analysis ← analyser get game.id
- } yield analysis.fold(Annotator(pgnObj, _), pgnObj)
+ } yield analysis.fold(pgnObj)(Annotator(pgnObj, _))
def filename(game: DbGame): IO[String] = for {
whiteUser ← user(game.whitePlayer)
@@ -35,15 +35,11 @@ final class PgnDump(
private val baseUrl = "http://lichess.org/"
private val dateFormat = DateTimeFormat forPattern "yyyy-MM-dd";
- private def elo(p: DbPlayer) = p.elo.fold(_.toString, "?")
+ private def elo(p: DbPlayer) = p.elo.fold("?")(_.toString)
- private def user(p: DbPlayer): IO[Option[User]] = p.userId.fold(
- userRepo.byId,
- io(none))
+ private def user(p: DbPlayer): IO[Option[User]] = p.userId.fold(io(none[User]))(userRepo.byId)
- private def player(p: DbPlayer, u: Option[User]) = p.aiLevel.fold(
- "AI level " + _,
- u.fold(_.username, "Anonymous"))
+ private def player(p: DbPlayer, u: Option[User]) = p.aiLevel.fold(u.fold(_.username, "Anonymous"))("AI level " + _)
private def tags(game: DbGame): IO[List[Tag]] = for {
whiteUser ← user(game.whitePlayer)
@@ -77,8 +73,6 @@ final class PgnDump(
object PgnDump {
def result(game: DbGame) = game.finished.fold(
- game.winnerColor.fold(
- color ⇒ color.white.fold("1-0", "0-1"),
- "1/2-1/2"),
+ game.winnerColor.fold("1/2-1/2")(color ⇒ color.white.fold("1-0", "0-1")),
"*")
}
diff --git a/app/analyse/TimeChart.scala b/app/analyse/TimeChart.scala
index 9baae218a4..35884c3114 100644
--- a/app/analyse/TimeChart.scala
+++ b/app/analyse/TimeChart.scala
@@ -5,18 +5,22 @@ import game.{ DbPlayer, DbGame, Namer }
import chess.Color.{ White, Black }
import scala.math.round
-import com.codahale.jerkson.Json
+import play.api.libs.json.Json
final class TimeChart(game: DbGame) {
- def columns = Json generate {
- List("string", "Move") :: game.players.map(p ⇒
- List("number", "%s - %s".format(p.color, Namer.player(p)(identity))))
+ def columns = Json stringify {
+ Json toJson {
+ List("string", "Move") :: game.players.map(p ⇒
+ List("number", "%s - %s".format(p.color, Namer.player(p)(identity))))
+ }
}
- def rows = Json generate {
- (game.player(White).moveTimeList zip game.player(Black).moveTimeList).zipWithIndex map {
- case ((white, black), move) ⇒ List(move.toString, white, black)
+ def rows = Json stringify {
+ Json toJson {
+ (game.player(White).moveTimeList zip game.player(Black).moveTimeList).zipWithIndex map {
+ case ((white, black), move) ⇒ List(move.toString, white, black)
+ }
}
}
}
diff --git a/app/analyse/TimePie.scala b/app/analyse/TimePie.scala
index a8c7c5bfae..008e9fb6b2 100644
--- a/app/analyse/TimePie.scala
+++ b/app/analyse/TimePie.scala
@@ -3,15 +3,17 @@ package analyse
import game.{ DbPlayer, Pov }
-import com.codahale.jerkson.Json
+import play.api.libs.json.Json
final class TimePie(val pov: Pov) {
- def columns = Json generate List(
- "string" :: "Time in seconds" :: Nil,
- "number" :: "Number of moves" :: Nil)
+ def columns = Json stringify {
+ Json toJson List(
+ "string" :: "Time in seconds" :: Nil,
+ "number" :: "Number of moves" :: Nil)
+ }
- def rows = Json generate {
+ def rows = Json stringify {
import pov._
@@ -29,8 +31,10 @@ final class TimePie(val pov: Pov) {
else "%d to %d seconds".format(min, max)
}
- ranges zip (ranges map nbMoves) collect {
- case (range, nb) if nb > 0 ⇒ List(nameRange(range), nb)
+ Json toJson {
+ ranges zip (ranges map nbMoves) collect {
+ case (range, nb) if nb > 0 ⇒ List(nameRange(range), nb)
+ }
}
}
}
diff --git a/app/bookmark/BookmarkApi.scala b/app/bookmark/BookmarkApi.scala
index 14be7685a8..66d8e4126e 100644
--- a/app/bookmark/BookmarkApi.scala
+++ b/app/bookmark/BookmarkApi.scala
@@ -15,13 +15,13 @@ final class BookmarkApi(
def toggle(gameId: String, user: User): IO[Unit] = for {
gameOption ← gameRepo game gameId
- _ ← gameOption.fold(
- game ⇒ for {
+ _ ← gameOption.fold(io()) { game =>
+ for {
bookmarked ← bookmarkRepo.toggle(game.id, user.id)
_ ← gameRepo.incBookmarks(game.id, bookmarked.fold(1, -1))
_ ← io(cached invalidateUserId user.id)
- } yield (),
- io())
+ } yield ()
+ }
} yield ()
def bookmarked(game: DbGame, user: User): Boolean =
diff --git a/app/controllers/Ai.scala b/app/controllers/Ai.scala
index ac427cf446..92d8f93ec8 100644
--- a/app/controllers/Ai.scala
+++ b/app/controllers/Ai.scala
@@ -8,7 +8,7 @@ import mvc._
import play.api.libs.concurrent._
import play.api.Play.current
-import akka.dispatch.Future
+import scala.concurrent.Future
object Ai extends LilaController {
@@ -24,7 +24,7 @@ object Ai extends LilaController {
pgn = getOr("pgn", ""),
initialFen = get("initialFen"),
level = getIntOr("level", 1)
- ).asPromise map (_.fold(
+ ) map (_.fold(
err ⇒ BadRequest(err.shows),
Ok(_)
))
@@ -39,7 +39,7 @@ object Ai extends LilaController {
stockfishServer.analyse(
pgn = getOr("pgn", ""),
initialFen = get("initialFen")
- ).asPromise map (_.fold(
+ ) map (_.fold(
err ⇒ InternalServerError(err.shows),
analyse ⇒ Ok(analyse.encode)
))
@@ -50,10 +50,7 @@ object Ai extends LilaController {
def reportStockfish = Action { implicit req ⇒
IfServer {
Async {
- env.ai.stockfishServerReport.fold(
- _ map { Ok(_) },
- Future(NotFound)
- ).asPromise
+ env.ai.stockfishServerReport.fold(Future(NotFound)) { _ map { Ok(_) } }
}
}
}
diff --git a/app/controllers/Analyse.scala b/app/controllers/Analyse.scala
index 6a52bead04..2d7fe46896 100644
--- a/app/controllers/Analyse.scala
+++ b/app/controllers/Analyse.scala
@@ -11,6 +11,7 @@ import play.api.http.ContentTypes
import play.api.templates.Html
import play.api.libs.concurrent._
import scalaz.effects._
+import scala.util.{Try, Success, Failure}
object Analyse extends LilaController {
@@ -28,8 +29,8 @@ object Analyse extends LilaController {
def computer(id: String, color: String) = Auth { implicit ctx ⇒
me ⇒
analyser.getOrGenerate(id, me.id, isGranted(_.MarkEngine)) onComplete {
- case Left(e) ⇒ println(e.getMessage)
- case Right(a) ⇒ a.fold(
+ case Failure(e) ⇒ println(e.getMessage)
+ case Success(a) ⇒ a.fold(
err ⇒ println("Computer analysis failure: " + err.shows),
analysis ⇒ roundHubMaster ! AnalysisAvailable(id)
)
@@ -70,8 +71,8 @@ object Analyse extends LilaController {
def pgn(id: String) = Open { implicit ctx ⇒
IOResult(for {
gameOption ← gameRepo game id
- res ← gameOption.fold(
- game ⇒ for {
+ res ← gameOption.fold(io(NotFound("No such game")), { game =>
+ for {
pgnString ← pgnRepo get id
pgnObj ← pgnDump(game, pgnString)
content = pgnObj.toString
@@ -80,9 +81,8 @@ object Analyse extends LilaController {
CONTENT_LENGTH -> content.size.toString,
CONTENT_TYPE -> ContentTypes.TEXT,
CONTENT_DISPOSITION -> ("attachment; filename=" + filename)
- ),
- io(NotFound("No such game"))
- )
+ )
+ }
} yield res)
}
}
diff --git a/app/controllers/LilaController.scala b/app/controllers/LilaController.scala
index a25f5992cf..e2ca169d03 100644
--- a/app/controllers/LilaController.scala
+++ b/app/controllers/LilaController.scala
@@ -9,7 +9,7 @@ import core.Global
import play.api.mvc._
import play.api.data.Form
import play.api.http._
-import com.codahale.jerkson.Json
+import play.api.libs.json.Json
import scalaz.effects._
trait LilaController
@@ -25,7 +25,7 @@ trait LilaController
override implicit def lang(implicit req: RequestHeader) =
env.i18n.pool.lang(req)
- protected def toJson(map: Map[String, Any]) = Json generate map
+ protected def toJson(map: Map[String, Any]) = Json toJson map
protected def Open(f: Context ⇒ Result): Action[AnyContent] =
Open(BodyParsers.parse.anyContent)(f)
@@ -77,9 +77,9 @@ trait LilaController
protected def NoEngine[A <: Result](a: ⇒ A)(implicit ctx: Context): Result =
ctx.me.fold(false)(_.engine).fold(Forbidden(views.html.site.noEngine()), a)
- protected def JsonOk(map: Map[String, Any]) = Ok(toJson(map)) as JSON
+ protected def JsonOk(map: Map[String, Any]) = Ok(Json toJson map) as JSON
- protected def JsonOk(list: List[Any]) = Ok(Json generate list) as JSON
+ protected def JsonOk(list: List[Any]) = Ok(Json toJson list) as JSON
protected def JsonIOk(map: IO[Map[String, Any]]) = JsonOk(map.unsafePerformIO)
@@ -134,16 +134,16 @@ trait LilaController
implicit writer: Writeable[B],
ctype: ContentTypeOf[B],
ctx: Context) =
- ioa.unsafePerformIO.fold(a ⇒ Ok(op(a)), notFound(ctx))
+ ioa.unsafePerformIO.fold(notFound(ctx))(a ⇒ Ok(op(a)))
protected def IOptionIOk[A, B](ioa: IO[Option[A]])(op: A ⇒ IO[B])(
implicit writer: Writeable[B],
ctype: ContentTypeOf[B],
ctx: Context) =
ioa flatMap { aOption ⇒
- aOption.fold(
- a ⇒ op(a) map { Ok(_) },
- io(notFound(ctx))): IO[Result]
+ aOption.fold(io(notFound(ctx))) { a =>
+ a ⇒ op(a) map { Ok(_) }
+ }//: IO[Result]
} unsafePerformIO
protected def IOptionIOResult[A](ioa: IO[Option[A]])(op: A ⇒ IO[Result])(implicit ctx: Context) =
diff --git a/app/controllers/Lobby.scala b/app/controllers/Lobby.scala
index a0ef2dba16..061b137ffc 100644
--- a/app/controllers/Lobby.scala
+++ b/app/controllers/Lobby.scala
@@ -8,7 +8,8 @@ import views._
import play.api.mvc._
import play.api.libs.json.JsValue
import play.api.libs.concurrent._
-import akka.dispatch.Future
+import play.api.libs.concurrent.execution.Implicits._
+import scala.concurrent.{ Future, Promise }
import scalaz.effects._
object Lobby extends LilaController with Results {
@@ -44,7 +45,7 @@ object Lobby extends LilaController with Results {
posts,
tours,
featured))
- })).asPromise
+ }))
def socket = WebSocket.async[JsValue] { implicit req ⇒
implicit val ctx = reqToCtx(req)
@@ -59,11 +60,8 @@ object Lobby extends LilaController with Results {
def hook(ownerId: String) = Open { implicit ctx ⇒
Async {
hookRepo.ownedHook(ownerId).unsafePerformIO.fold(
- hook ⇒ renderHome(hook.some, Ok),
- Promise.pure {
- Redirect(routes.Lobby.home)
- }
- )
+ Promise pure { Redirect(routes.Lobby.home) }
+ ) { hook ⇒ renderHome(hook.some, Ok) }
}
}
@@ -72,7 +70,7 @@ object Lobby extends LilaController with Results {
val myHookId = get("cancel")
joiner(hookId, myHookId)(ctx.me) map { result ⇒
result.fold(
- _ ⇒ myHookId.fold(routes.Lobby.hook(_), routes.Lobby.home),
+ _ ⇒ myHookId.fold(routes.Lobby.home)(routes.Lobby.hook(_)),
pov ⇒ routes.Round.player(pov.fullId))
}
}
@@ -82,7 +80,7 @@ object Lobby extends LilaController with Results {
IORedirect {
for {
hook ← hookRepo ownedHook ownerId
- _ ← hook.fold(fisherman.delete, io())
+ _ ← hook.fold(io())(fisherman.delete)
} yield routes.Lobby.home
}
}
diff --git a/app/controllers/Monitor.scala b/app/controllers/Monitor.scala
index ac82639bb4..3198276639 100644
--- a/app/controllers/Monitor.scala
+++ b/app/controllers/Monitor.scala
@@ -28,13 +28,13 @@ object Monitor extends LilaController {
def status = Action {
Async {
- (reporting ? GetStatus).mapTo[String].asPromise map { Ok(_) }
+ (reporting ? GetStatus).mapTo[String] map { Ok(_) }
}
}
def nbPlayers = Action {
Async {
- (reporting ? GetNbMembers).mapTo[Int].asPromise map { players ⇒
+ (reporting ? GetNbMembers).mapTo[Int] map { players ⇒
Ok("%d %d".format(players, usernameMemo.preciseCount))
}
}
@@ -42,7 +42,7 @@ object Monitor extends LilaController {
def nbMoves = Action {
Async {
- (reporting ? GetNbMoves).mapTo[Int].asPromise map { Ok(_) }
+ (reporting ? GetNbMoves).mapTo[Int] map { Ok(_) }
}
}
}
diff --git a/app/controllers/Round.scala b/app/controllers/Round.scala
index 7ff7a37daa..d474b53cec 100644
--- a/app/controllers/Round.scala
+++ b/app/controllers/Round.scala
@@ -140,11 +140,11 @@ object Round extends LilaController with TheftPrevention with RoundEventPerforme
def players(gameId: String) = Open { implicit ctx ⇒
import templating.Environment.playerLink
JsonIOk(gameRepo game gameId map { gameOption ⇒
- gameOption.fold(Map()) { game ⇒
+ ~(gameOption map { game ⇒
(game.players collect {
case player if player.isHuman ⇒ player.color.name -> playerLink(player).text
- } toMap) ++ ctx.me.fold(me ⇒ Map("me" -> me.usernameWithElo), Map())
- }
+ } toMap) ++ ~ctx.me.map(me ⇒ Map("me" -> me.usernameWithElo))
+ })
})
}
diff --git a/app/controllers/User.scala b/app/controllers/User.scala
index d1236e1147..939ce655a4 100644
--- a/app/controllers/User.scala
+++ b/app/controllers/User.scala
@@ -40,9 +40,9 @@ object User extends LilaController {
val userSpy = isGranted(_.UserSpy) option securityStore.userSpy _
env.user.userInfo(u, bookmarkApi, userSpy, ctx) map { info ⇒
val filters = user.GameFilterMenu(info, ctx.me, filterName)
- val paginator = filters.query.fold(
- query ⇒ gamePaginator.recentlyCreated(query, filters.cachedNb)(page),
- bookmarkApi.gamePaginatorByUser(u, page))
+ val paginator = filters.query.fold(bookmarkApi.gamePaginatorByUser(u, page)) { query ⇒
+ gamePaginator.recentlyCreated(query, filters.cachedNb)(page)
+ }
html.user.show(u, info, paginator, filters)
}
}, io(html.user.disabled(u)))
diff --git a/app/core/Cron.scala b/app/core/Cron.scala
index 66a7f91e60..188d8c4a09 100644
--- a/app/core/Cron.scala
+++ b/app/core/Cron.scala
@@ -103,7 +103,7 @@ object Cron {
Akka.system.scheduler.schedule(freq, randomize(freq), to._1, to._2)
}
- def effect(freq: Duration, name: String)(op: ⇒ IO[_]) {
+ def effect(freq: FiniteDuration, name: String)(op: ⇒ IO[_]) {
val f = randomize(freq)
println("schedule effect %s every %s -> %s".format(name, freq, f))
Akka.system.scheduler.schedule(f, f) {
@@ -111,7 +111,7 @@ object Cron {
}
}
- def unsafe(freq: Duration, name: String)(op: ⇒ Unit) {
+ def unsafe(freq: FiniteDuration, name: String)(op: ⇒ Unit) {
Akka.system.scheduler.schedule(freq, randomize(freq)) {
tryNamed(name, op)
}
@@ -127,7 +127,7 @@ object Cron {
}
}
- private def randomize(d: Duration, ratio: Float = 0.1f): FiniteDuration = {
+ private def randomize(d: FiniteDuration, ratio: Float = 0.1f): FiniteDuration = {
import scala.util.Random
import scala.math.round
import ornicar.scalalib.Random.approximatly
diff --git a/app/forum/PostApi.scala b/app/forum/PostApi.scala
index 8809888ec4..e15bb59d53 100644
--- a/app/forum/PostApi.scala
+++ b/app/forum/PostApi.scala
@@ -77,9 +77,9 @@ final class PostApi(
def delete(postId: String, mod: User): IO[Unit] = for {
postOption ← env.postRepo byId postId
- viewOption ← postOption.fold(io(none))(view)
- _ ← viewOption.fold(
- view ⇒ for {
+ viewOption ← postOption.fold(io(none[PostView]))(view)
+ _ ← viewOption.fold(io()) { view ⇒
+ for {
_ ← (view.topic.nbPosts == 1).fold(
env.topicApi.delete(view.categ, view.topic),
for {
@@ -90,10 +90,9 @@ final class PostApi(
} yield ()
)
post = view.post
- _ ← modLog.deletePost(mod, post.userId, post.author, post.ip,
+ _ ← modLog.deletePost(mod, post.userId, post.author, post.ip,
text = "%s / %s / %s".format(view.categ.name, view.topic.name, post.text))
- } yield (),
- io()
- )
+ } yield ()
+ }
} yield ()
}
diff --git a/app/forum/TopicApi.scala b/app/forum/TopicApi.scala
index 611acdcd36..7bce7bcb40 100644
--- a/app/forum/TopicApi.scala
+++ b/app/forum/TopicApi.scala
@@ -12,9 +12,7 @@ final class TopicApi(env: ForumEnv, maxPerPage: Int) {
def show(categSlug: String, slug: String, page: Int): IO[Option[(Categ, Topic, Paginator[Post])]] =
for {
data ← get(categSlug, slug)
- _ ← data.fold({
- case (_, topic) ⇒ env.topicRepo incViews topic
- }, io())
+ _ ← data.fold(io())({ case (_, topic) ⇒ env.topicRepo incViews topic })
} yield data map {
case (categ, topic) ⇒ (categ, topic, env.postApi.paginator(topic, page))
}
diff --git a/app/game/DbGame.scala b/app/game/DbGame.scala
index 574d31e8f1..87cb9fc1c7 100644
--- a/app/game/DbGame.scala
+++ b/app/game/DbGame.scala
@@ -130,15 +130,12 @@ case class DbGame(
ps = player encodePieces game.allPieces,
blurs = player.blurs + (blur && move.color == player.color).fold(1, 0),
moveTimes = (move.color == player.color).fold(
- lastMoveTime.fold(
- lmt ⇒ (nowSeconds - lmt) |> { mt ⇒
+ lastMoveTime.fold("") { lmt ⇒
+ (nowSeconds - lmt) |> { mt ⇒
val encoded = MoveTime encode mt
player.moveTimes.isEmpty.fold(encoded.toString, player.moveTimes + encoded)
- },
- ""
- ),
- player.moveTimes)
- )
+ }
+ }, player.moveTimes))
val updated = copy(
whitePlayer = copyPlayer(whitePlayer),
@@ -158,7 +155,7 @@ case class DbGame(
)
val finalEvents = events :::
- updated.clock.fold(c ⇒ List(Event.Clock(c)), Nil) ::: {
+ ~updated.clock.map(c ⇒ List(Event.Clock(c))) ::: {
(updated.playable && (
abortable != updated.abortable || (Color.all exists { color ⇒
playerCanOfferDraw(color) != updated.playerCanOfferDraw(color)
@@ -185,10 +182,9 @@ case class DbGame(
updatedAt = DateTime.now.some
))
- def startClock(compensation: Float) = clock filterNot (_.isRunning) fold (
- c ⇒ copy(clock = c.run.giveTime(creatorColor, compensation).some),
- this
- )
+ def startClock(compensation: Float) = clock.filterNot(_.isRunning).fold(this) { c ⇒
+ copy(clock = c.run.giveTime(creatorColor, compensation).some)
+ }
def hasMoveTimes = players forall (_.hasMoveTimes)
@@ -222,7 +218,7 @@ case class DbGame(
!(playerHasOfferedDraw(color))
def playerHasOfferedDraw(color: Color) =
- player(color).lastDrawOffer.fold(_ >= turns - 1, false)
+ player(color).lastDrawOffer.fold(false)(_ >= turns - 1)
def playerCanRematch(color: Color) =
finishedOrAborted && opponent(color).isHuman && nonTournament
@@ -273,14 +269,11 @@ case class DbGame(
def hasClock = clock.isDefined
- def isClockRunning = clock.fold(_.isRunning, false)
+ def isClockRunning = clock.fold(false)(_.isRunning)
def withClock(c: Clock) = Progress(this, copy(clock = Some(c)))
- def estimateTotalTime = clock.fold(
- c ⇒ c.limit + 30 * c.increment,
- 1200 // default to 20 minutes
- )
+ def estimateTotalTime = clock.fold(1200) { c ⇒ c.limit + 30 * c.increment }
def creator = player(creatorColor)
@@ -310,12 +303,11 @@ case class DbGame(
}
def isBeingPlayed =
- !finishedOrAborted && updatedAt.fold(_ > DateTime.now - 20.seconds, false)
+ !finishedOrAborted && updatedAt.fold(false)(_ > DateTime.now - 20.seconds)
- def abandoned = updatedAt.fold(
- u ⇒ (status <= Status.Started) && (u <= DbGame.abandonedDate),
- false
- )
+ def abandoned = updatedAt.fold(false) { u =>
+ (status <= Status.Started) && (u <= DbGame.abandonedDate)
+ }
def hasBookmarks = bookmarks > 0
@@ -437,7 +429,7 @@ case class RawDbGame(
clock = c map (_.decode),
lastMove = lm,
check = ck flatMap Pos.posAt,
- creatorColor = cc.fold(Color.apply, Color.White),
+ creatorColor = cc.fold(Color.white)(Color.apply),
positionHashes = ph | "",
castles = cs | "-",
mode = (ra map Mode.apply) | Mode.Casual,
diff --git a/app/game/DbPlayer.scala b/app/game/DbPlayer.scala
index 33b029acf3..18a2b61d13 100644
--- a/app/game/DbPlayer.scala
+++ b/app/game/DbPlayer.scala
@@ -42,7 +42,7 @@ case class DbPlayer(
def hasUser = userId.isDefined
- def isUser(u: User) = userId.fold(_ == u.id, false)
+ def isUser(u: User) = userId.fold(false)(_ == u.id)
def wins = isWinner getOrElse false
diff --git a/app/game/Export.scala b/app/game/Export.scala
index 95fb132e3d..334a65ba41 100644
--- a/app/game/Export.scala
+++ b/app/game/Export.scala
@@ -34,22 +34,22 @@ final class Export(user: User, gameRepo: GameRepo) {
List(
id,
dateFormatter.print(game.createdAt),
- player.fold(_.color.name, "?"),
+ player.fold("?")(_.color.name),
(player map game.opponent flatMap (_.userId)) | "anonymous",
PgnDump result game,
game.status,
game.turns - 1,
game.variant,
game.mode,
- game.clock.fold(c ⇒ "%d %d".format(
- c.limitInMinutes, c.increment),
- "unlimited"),
- (player flatMap (_.elo)).fold(_.toString, "?"),
- (player flatMap (_.eloDiff)).fold(showEloDiff, "?"),
- (player map game.opponent flatMap (_.elo)).fold(_.toString, "?"),
- (player map game.opponent flatMap (_.eloDiff)).fold(showEloDiff, "?"),
- baseUrl + routes.Round.watcher(game.id, player.fold(_.color.name, "white")),
- baseUrl + routes.Analyse.replay(game.id, player.fold(_.color.name, "white")),
+ game.clock.fold("unlimited") { c ⇒
+ "%d %d".format(c.limitInMinutes, c.increment)
+ }
+ (player flatMap (_.elo)).fold("?")(_.toString),
+ (player flatMap (_.eloDiff)).fold("?")(showEloDiff),
+ (player map game.opponent flatMap (_.elo)).fold("?")(_.toString),
+ (player map game.opponent flatMap (_.eloDiff)).fold("?")(showEloDiff),
+ baseUrl + routes.Round.watcher(game.id, player.fold("white")(_.color.name)),
+ baseUrl + routes.Analyse.replay(game.id, player.fold("white")(_.color.name)),
baseUrl + routes.Analyse.pgn(game.id)
)
}
diff --git a/app/game/Featured.scala b/app/game/Featured.scala
index 842684963e..4cb2a4e315 100644
--- a/app/game/Featured.scala
+++ b/app/game/Featured.scala
@@ -2,9 +2,8 @@ package lila
package game
import akka.actor._
-import akka.dispatch.{ Future, Await }
+import scala.concurrent.{ Future, Await }
import akka.pattern.ask
-import scala.concurrent.Duration
import scala.concurrent.duration._
import akka.util.Timeout
import play.api.Play.current
diff --git a/app/game/GameHelper.scala b/app/game/GameHelper.scala
index 87e8e15774..ae0606526b 100644
--- a/app/game/GameHelper.scala
+++ b/app/game/GameHelper.scala
@@ -47,19 +47,19 @@ trait GameHelper { self: I18nHelper with UserHelper with StringHelper with AiHel
player.userId.fold(
"""%s""".format(
cssClass | "",
- player.aiLevel.fold(aiName, User.anonymous)
+ player.aiLevel.fold(User.anonymous)(aiName)
)
) { userId ⇒
userIdToUsername(userId) |> { username ⇒
"""%s%s""".format(
- cssClass.fold(" " + _, ""),
+ ~cssClass.map(" " + _),
withOnline.fold(
isUsernameOnline(username).fold(" online", " offline"),
""),
routes.User.show(username),
- usernameWithElo(player) + player.eloDiff.filter(_ ⇒ withDiff).fold(
- diff ⇒ " (%s)".format(showNumber(diff)),
- ""),
+ usernameWithElo(player) + ~(player.eloDiff filter (_ ⇒ withDiff) map { diff ⇒
+ " (%s)".format(showNumber(diff))
+ }),
engine.fold(
"""""" format trans.thisPlayerUsesChessComputerAssistance(),
"")
diff --git a/app/game/GameRepo.scala b/app/game/GameRepo.scala
index f0e48e0191..9d6003b64e 100644
--- a/app/game/GameRepo.scala
+++ b/app/game/GameRepo.scala
@@ -37,7 +37,7 @@ final class GameRepo(collection: MongoCollection)
}
def pov(gameId: String, color: String): IO[Option[Pov]] =
- Color(color).fold(pov(gameId, _), io(None))
+ Color(color).fold(io(none[Pov]))(pov(gameId, _))
def pov(fullId: String): IO[Option[Pov]] =
game(fullId take gameIdSize) map { gameOption ⇒
@@ -62,8 +62,8 @@ final class GameRepo(collection: MongoCollection)
case (sets, unsets) ⇒ {
val fullSets = ("ua" -> new Date) :: sets
val ops = unsets.isEmpty.fold(
- $set(fullSets: _*),
- $set(fullSets: _*) ++ $unset(unsets: _*)
+ $set(fullSets),
+ $set(fullSets) ++ $unset(unsets)
)
val wc = WriteConcern.None
io { collection.update(idSelector(progress.origin), ops, concern = wc) }
diff --git a/app/game/Handler.scala b/app/game/Handler.scala
index 6d340f4731..7b50fc3dd4 100644
--- a/app/game/Handler.scala
+++ b/app/game/Handler.scala
@@ -2,7 +2,7 @@ package lila
package game
import scalaz.effects._
-import akka.dispatch.Future
+import scala.concurrent.Future
abstract class Handler(gameRepo: GameRepo) extends core.Futuristic {
diff --git a/app/game/Namer.scala b/app/game/Namer.scala
index 2894629354..d59ec9ab21 100644
--- a/app/game/Namer.scala
+++ b/app/game/Namer.scala
@@ -8,13 +8,10 @@ object Namer {
def player(player: DbPlayer, withElo: Boolean = true)(getUsername: String ⇒ String) =
player.aiLevel.fold(
- level ⇒ "A.I. level " + level,
- (player.userId map getUsername).fold(
- username ⇒ withElo.fold(
- "%s (%s)".format(username, player.elo getOrElse "?"),
- username),
- User.anonymous)
- )
+ (player.userId map getUsername).fold(User.anonymous) { username ⇒
+ withElo.fold("%s (%s)".format(username, player.elo getOrElse "?"), username)
+ }
+ ) { level ⇒ "A.I. level " + level }
def clock(clock: Clock): String = "%d minutes/side + %d seconds/move".format(
clock.limitInMinutes, clock.increment)
diff --git a/app/http/Context.scala b/app/http/Context.scala
index e694563f81..6a6ca6add7 100644
--- a/app/http/Context.scala
+++ b/app/http/Context.scala
@@ -12,7 +12,7 @@ sealed abstract class Context(val req: RequestHeader, val me: Option[User]) {
def isAnon = !isAuth
- def canSeeChat = me.fold(!_.isChatBan, false)
+ def canSeeChat = ~me.map(!_.isChatBan)
def isGranted(permission: Permission): Boolean = me.fold(Granter(permission), false)
diff --git a/app/http/Setting.scala b/app/http/Setting.scala
index 4806e9e97e..7fee29ec11 100644
--- a/app/http/Setting.scala
+++ b/app/http/Setting.scala
@@ -27,11 +27,11 @@ final class Setting(ctx: Context) {
} getOrElse default
private def set(name: String, value: String)(userRepo: UserRepo): IO[Cookie] =
- ctx.me.fold(
- m ⇒ userRepo.saveSetting(m, name, value.toString),
- io()) map { _ ⇒
- LilaCookie.session(name, value.toString)(ctx.req)
- }
+ ctx.me.fold(io()) { m ⇒
+ userRepo.saveSetting(m, name, value.toString)
+ } map { _ ⇒
+ LilaCookie.session(name, value.toString)(ctx.req)
+ }
}
object Setting {
diff --git a/app/i18n/Translator.scala b/app/i18n/Translator.scala
index 68383e2be5..315a384ee5 100644
--- a/app/i18n/Translator.scala
+++ b/app/i18n/Translator.scala
@@ -37,7 +37,7 @@ final class Translator(api: MessagesApi, pool: I18nPool) {
Some(if (args.isEmpty) pattern else pattern.format(args: _*))
}
catch {
- case e ⇒ {
+ case e: Exception ⇒ {
println("Failed to translate %s -> %s (%s) - %s".format(
key, pattern, args, e.getMessage))
None
diff --git a/app/lobby/Preload.scala b/app/lobby/Preload.scala
index ac5f4e75c6..4b9e462aec 100644
--- a/app/lobby/Preload.scala
+++ b/app/lobby/Preload.scala
@@ -11,7 +11,7 @@ import tournament.Created
import play.api.mvc.Call
import play.api.libs.concurrent.Akka
import play.api.Play.current
-import akka.dispatch.Future
+import scala.concurrent.Future
import scala.concurrent.duration._
import akka.util.Timeout
import scalaz.effects._
diff --git a/app/lobby/Socket.scala b/app/lobby/Socket.scala
index be53f9251c..8a1cb16122 100644
--- a/app/lobby/Socket.scala
+++ b/app/lobby/Socket.scala
@@ -42,7 +42,7 @@ final class Socket(hub: ActorRef, flood: Flood) {
val promise = for {
version ← versionOption
uid ← uidOption
- } yield (hub ? Join(uid, username, version, hook)).asPromise map {
+ } yield (hub ? Join(uid, username, version, hook)) map {
case Connected(enumerator, channel) ⇒
val iteratee = Iteratee.foreach[JsValue] { e ⇒
e str "t" match {
diff --git a/app/memo/ActorMemo.scala b/app/memo/ActorMemo.scala
index 280074e199..fe20c337c1 100644
--- a/app/memo/ActorMemo.scala
+++ b/app/memo/ActorMemo.scala
@@ -2,9 +2,8 @@ package lila
package memo
import akka.actor._
-import akka.dispatch.{ Future, Await }
+import scala.concurrent.{ Future, Await }
import akka.pattern.ask
-import scala.concurrent.Duration
import scala.concurrent.duration._
import akka.util.Timeout
diff --git a/app/message/Api.scala b/app/message/Api.scala
index e4c0aa4812..422c640a5c 100644
--- a/app/message/Api.scala
+++ b/app/message/Api.scala
@@ -54,7 +54,7 @@ final class Api(
for {
_ ← threadRepo saveIO newThread
receiver ← userRepo byId (thread receiverOf post)
- _ ← receiver.fold(updateUser, io())
+ _ ← receiver.fold(io())(updateUser)
} yield thread
}
diff --git a/app/mod/ModlogApi.scala b/app/mod/ModlogApi.scala
index 381815f22b..9385df73c5 100644
--- a/app/mod/ModlogApi.scala
+++ b/app/mod/ModlogApi.scala
@@ -25,7 +25,7 @@ final class ModlogApi(repo: ModlogRepo) {
def deletePost(mod: User, userId: Option[String], author: Option[String], ip: Option[String], text: String) = add {
Modlog(mod.id, userId, Modlog.deletePost, details = Some(
- author.fold(_ + " ", "") + ip.fold(_ + " ", "") + text.take(140)
+ author.fold("")(_ + " ") + ip.fold("")(_ + " ") + text.take(140)
))
}
diff --git a/app/monitor/Reporting.scala b/app/monitor/Reporting.scala
index 7724676470..9453911e5a 100644
--- a/app/monitor/Reporting.scala
+++ b/app/monitor/Reporting.scala
@@ -8,7 +8,7 @@ import akka.actor._
import akka.pattern.{ ask, pipe }
import scala.concurrent.duration._
import akka.util.{ Duration, Timeout }
-import akka.dispatch.{ Future, Promise }
+import scala.concurrent.{ Future, Promise }
import play.api.libs.concurrent._
import play.api.Play.current
import scala.io.Source
diff --git a/app/monitor/Socket.scala b/app/monitor/Socket.scala
index 2397a1a4f9..868966208b 100644
--- a/app/monitor/Socket.scala
+++ b/app/monitor/Socket.scala
@@ -21,7 +21,7 @@ final class Socket(hub: ActorRef) {
uidOption: Option[String]): SocketPromise = {
val promise: Option[SocketPromise] = for {
uid ← uidOption
- } yield (hub ? Join(uid)).asPromise map {
+ } yield (hub ? Join(uid)) map {
case Connected(enumerator, channel) ⇒
val iteratee = Iteratee.foreach[JsValue] { e ⇒
e str "t" match {
diff --git a/app/package.scala b/app/package.scala
index 75d60f2799..406177c0cb 100644
--- a/app/package.scala
+++ b/app/package.scala
@@ -5,6 +5,7 @@ import play.api.libs.concurrent.Promise
import play.api.libs.iteratee.{ Iteratee, Enumerator }
import play.api.libs.iteratee.Concurrent.Channel
import play.api.Play.current
+import scala.concurrent.{ Future, Promise }
import com.novus.salat.{ Context, TypeHintFrequency, StringTypeHintStrategy }
import com.mongodb.casbah.commons.conversions.scala.RegisterJodaTimeConversionHelpers
@@ -20,6 +21,7 @@ package object lila
with scalaz.NonEmptyLists
with scalaz.Strings
with scalaz.Lists
+ with scalaz.Zeros
with scalaz.Booleans {
type JsChannel = Channel[JsValue]
diff --git a/app/round/Hand.scala b/app/round/Hand.scala
index 1961ba6fde..97a9a80b43 100644
--- a/app/round/Hand.scala
+++ b/app/round/Hand.scala
@@ -10,7 +10,7 @@ import chess.format.Forsyth
import scalaz.effects._
import akka.actor._
-import akka.dispatch.{ Future, Await }
+import scala.concurrent.{ Future, Await }
import akka.pattern.ask
import scala.concurrent.duration._
import akka.util.Timeout
diff --git a/app/round/HubMaster.scala b/app/round/HubMaster.scala
index 0665672202..b48d336a6c 100644
--- a/app/round/HubMaster.scala
+++ b/app/round/HubMaster.scala
@@ -8,7 +8,7 @@ import akka.actor.ReceiveTimeout
import scala.concurrent.duration._
import akka.util.Timeout
import akka.pattern.{ ask, pipe }
-import akka.dispatch.Future
+import scala.concurrent.Future
import play.api.libs.json._
import play.api.libs.concurrent._
import play.api.Play.current
diff --git a/app/round/Socket.scala b/app/round/Socket.scala
index 4beda54fe9..a88e466ae3 100644
--- a/app/round/Socket.scala
+++ b/app/round/Socket.scala
@@ -5,7 +5,7 @@ import akka.actor._
import akka.pattern.ask
import scala.concurrent.duration._
import akka.util.Timeout
-import akka.dispatch.Await
+import scala.concurrent.Await
import play.api.libs.json._
import play.api.libs.iteratee._
import play.api.libs.concurrent._
@@ -160,7 +160,7 @@ final class Socket(
enumerator)
}
}
- } yield socket).asPromise: SocketPromise
+ } yield socket): SocketPromise
}) | connectionFail
// full game ids that have been hijacked
diff --git a/app/site/Socket.scala b/app/site/Socket.scala
index eb92b293be..382a76455b 100644
--- a/app/site/Socket.scala
+++ b/app/site/Socket.scala
@@ -27,7 +27,7 @@ final class Socket(hub: ActorRef) {
flag: Option[String]): SocketPromise = {
val promise: Option[SocketPromise] = for {
uid ← uidOption
- } yield (hub ? Join(uid, username, flag)).asPromise map {
+ } yield (hub ? Join(uid, username, flag)) map {
case Connected(enumerator, channel) ⇒
val iteratee = Iteratee.foreach[JsValue] { e ⇒
e str "t" match {
diff --git a/app/socket/MetaHub.scala b/app/socket/MetaHub.scala
index e933368387..04febe78e2 100644
--- a/app/socket/MetaHub.scala
+++ b/app/socket/MetaHub.scala
@@ -5,7 +5,7 @@ import akka.actor.ActorRef
import akka.pattern.{ ask, pipe }
import scala.concurrent._
import scala.concurrent.duration._
-import akka.util.{ Duration, Timeout }
+import akka.util.{ Timeout }
import play.api.libs.concurrent._
import play.api.Play.current
import play.api.libs.json._
diff --git a/app/tournament/HubMaster.scala b/app/tournament/HubMaster.scala
index 94cfa8ac74..f59eefd7c7 100644
--- a/app/tournament/HubMaster.scala
+++ b/app/tournament/HubMaster.scala
@@ -8,7 +8,7 @@ import akka.actor.ReceiveTimeout
import scala.concurrent.duration._
import akka.util.Timeout
import akka.pattern.{ ask, pipe }
-import akka.dispatch.{ Future, Promise }
+import scala.concurrent.{ Future, Promise }
import play.api.libs.json._
import play.api.libs.concurrent._
import play.api.Play.current
diff --git a/app/tournament/Organizer.scala b/app/tournament/Organizer.scala
index 96f5529ce4..0126e4781f 100644
--- a/app/tournament/Organizer.scala
+++ b/app/tournament/Organizer.scala
@@ -8,7 +8,7 @@ import akka.actor._
import scala.concurrent.duration._
import akka.util.Timeout
import akka.pattern.{ ask, pipe }
-import akka.dispatch.{ Future, Promise }
+import scala.concurrent.{ Future, Promise }
import play.api.libs.concurrent._
import play.api.Play.current
diff --git a/app/tournament/Reminder.scala b/app/tournament/Reminder.scala
index f45993dcdb..f5f911d3a2 100644
--- a/app/tournament/Reminder.scala
+++ b/app/tournament/Reminder.scala
@@ -6,7 +6,7 @@ import akka.actor.ReceiveTimeout
import scala.concurrent.duration._
import akka.util.Timeout
import akka.pattern.{ ask, pipe }
-import akka.dispatch.{ Future, Promise }
+import scala.concurrent.{ Future, Promise }
import play.api.libs.concurrent._
import play.api.Play.current
import play.api.libs.json._
diff --git a/app/tournament/Socket.scala b/app/tournament/Socket.scala
index bc2034e13f..5c6297bed1 100644
--- a/app/tournament/Socket.scala
+++ b/app/tournament/Socket.scala
@@ -5,7 +5,7 @@ import akka.actor._
import akka.pattern.ask
import scala.concurrent.duration._
import akka.util.Timeout
-import akka.dispatch.Await
+import scala.concurrent.Await
import play.api.libs.json._
import play.api.libs.iteratee._
import play.api.libs.concurrent._
@@ -73,7 +73,7 @@ final class Socket(
},
enumerator)
}
- } yield socket).asPromise: SocketPromise
+ } yield socket): SocketPromise
}) | connectionFail
}
diff --git a/app/user/UserRepo.scala b/app/user/UserRepo.scala
index a508cbcd4a..5587142ee3 100644
--- a/app/user/UserRepo.scala
+++ b/app/user/UserRepo.scala
@@ -83,11 +83,11 @@ class UserRepo(collection: MongoCollection)
}
def toggleChatBan(user: User): IO[Unit] = io {
- collection.update(byIdQuery(user), $set("isChatBan" -> !user.isChatBan))
+ collection.update(byIdQuery(user), $set(Seq("isChatBan" -> !user.isChatBan)))
}
def saveSetting(user: User, key: String, value: String) = io {
- collection.update(byIdQuery(user), $set(("settings." + key) -> value))
+ collection.update(byIdQuery(user), $set(Seq(("settings." + key) -> value)))
}
def exists(username: String): IO[Boolean] = io {
diff --git a/scalachess b/scalachess
index d7f00b7275..1d944956b5 160000
--- a/scalachess
+++ b/scalachess
@@ -1 +1 @@
-Subproject commit d7f00b7275bb43179e4eebadc4c63e65a1b05085
+Subproject commit 1d944956b54d6c17352149c2dbe8d3d8d4f7033e