Skip to content

Commit df99d86

Browse files
committed
Encapsulate some sealed traits in object, for easier qualified imports
1 parent 0e149cb commit df99d86

File tree

9 files changed

+50
-33
lines changed

9 files changed

+50
-33
lines changed

opentak/src/main/scala/com/github/daenyth/opentak/protocol/PlaytakCodec.scala

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
package com.github.daenyth.opentak.protocol
22

3-
import com.github.daenyth.taklib._
3+
import com.github.daenyth.taklib.{GameEndResult, Stone}
44

55
object PlaytakCodec {
66

@@ -47,6 +47,7 @@ object PlaytakCodec {
4747
import s._
4848
s"Game Start $gameNumber $size $whitePlayerusername vs $blackPlayerusername $yourColor"
4949
case Place(gameNumber, playStone) =>
50+
import Stone._
5051
val stoneType = playStone.stone match {
5152
case _: Capstone => "C"
5253
case _: StandingStone => "W"
@@ -61,6 +62,7 @@ object PlaytakCodec {
6162
case UpdateTime(gameNumber, whiteTime, blackTime) =>
6263
s"Game#$gameNumber Time $whiteTime $blackTime"
6364
case o: GameOver =>
65+
import GameEndResult._
6466
val result = o.result match {
6567
case RoadWin(player) => player.fold("0-R", "R-0")
6668
case DoubleRoad => "R-R" // Not actually supported by playtak or default rules, but different result sets can treat it differently.

taklib/src/main/scala/com/github/daenyth/taklib/Board.scala

Lines changed: 7 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@ package com.github.daenyth.taklib
22

33
import com.github.daenyth.taklib.Board._
44
import com.github.daenyth.taklib.Implicits.RichBoolean
5+
import com.github.daenyth.taklib.Stone._
56

67
import scala.annotation.tailrec
78
import scala.collection.immutable.IndexedSeq
@@ -239,6 +240,9 @@ sealed trait Stone {
239240
val owner: Player
240241
val isRoadStone: Boolean
241242
}
242-
case class Capstone(owner: Player) extends Stone { val isRoadStone = true }
243-
case class StandingStone(owner: Player) extends Stone { val isRoadStone = false }
244-
case class FlatStone(owner: Player) extends Stone { val isRoadStone = true }
243+
case object Stone {
244+
case class Capstone(owner: Player) extends Stone { val isRoadStone = true }
245+
case class StandingStone(owner: Player) extends Stone { val isRoadStone = false }
246+
case class FlatStone(owner: Player) extends Stone { val isRoadStone = true }
247+
}
248+

taklib/src/main/scala/com/github/daenyth/taklib/Game.scala

Lines changed: 30 additions & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
package com.github.daenyth.taklib
22

3+
import com.github.daenyth.taklib.GameEndResult._
34
import com.github.daenyth.taklib.Implicits.RichBoolean
45
import com.github.daenyth.taklib.RuleSet.GameRule
56

@@ -16,6 +17,7 @@ import scalaz.syntax.order._
1617
import scalaz.syntax.semigroup._
1718
import scalaz.{Equal, NonEmptyList, Semigroup, \/}
1819

20+
sealed trait GameEndResult
1921
object GameEndResult {
2022
implicit val gerInstance: Semigroup[GameEndResult] with Equal[GameEndResult] =
2123
new Semigroup[GameEndResult] with Equal[GameEndResult] {
@@ -43,15 +45,15 @@ object GameEndResult {
4345
case _ => false
4446
}
4547
}
48+
49+
sealed trait RoadResult extends GameEndResult
50+
sealed trait FlatResult extends GameEndResult
51+
case class RoadWin(player: Player) extends RoadResult
52+
case class FlatWin(player: Player) extends FlatResult
53+
case class WinByResignation(player: Player) extends GameEndResult
54+
case object DoubleRoad extends RoadResult
55+
case object Draw extends FlatResult
4656
}
47-
sealed trait GameEndResult
48-
sealed trait RoadResult extends GameEndResult
49-
sealed trait FlatResult extends GameEndResult
50-
case class RoadWin(player: Player) extends RoadResult
51-
case class FlatWin(player: Player) extends FlatResult
52-
case class WinByResignation(player: Player) extends GameEndResult
53-
case object DoubleRoad extends RoadResult
54-
case object Draw extends FlatResult
5557

5658
object RuleSet {
5759
type GameRule = (Game, TurnAction) => Option[InvalidMove]
@@ -63,10 +65,11 @@ trait RuleSet {
6365
@tailrec
6466
def go(rules: List[GameRule]): Option[InvalidMove] = rules match {
6567
case Nil => None
66-
case rule :: rs => rule(game, action) match {
67-
case s: Some[_] => s
68-
case None => go(rs)
69-
}
68+
case rule :: rs =>
69+
rule(game, action) match {
70+
case s: Some[_] => s
71+
case None => go(rs)
72+
}
7073
}
7174
go(rules)
7275
}
@@ -204,15 +207,16 @@ class Game private (val size: Int,
204207

205208
def takeTurn(action: TurnAction): MoveResult[Game] =
206209
rules.check(this, action).getOrElse {
207-
currentBoard.applyAction(nextPlayer, action).flatMap { nextState =>
208-
val newHistory = (action, nextState) <:: history
209-
val game = new Game(size, turnNumber + 1, rules, newHistory)
210-
game.winner match {
211-
case Some(gameEnd) => GameOver(gameEnd, game)
212-
case None => OkMove(game)
210+
currentBoard.applyAction(nextPlayer, action).flatMap { nextState =>
211+
val newHistory = (action, nextState) <:: history
212+
val game = new Game(size, turnNumber + 1, rules, newHistory)
213+
game.winner match {
214+
case Some(gameEnd) => GameOver(gameEnd, game)
215+
case None => OkMove(game)
216+
}
213217
}
214218
}
215-
}.noteInvalid(action)
219+
.noteInvalid(action)
216220

217221
def undo: MoveResult[Game] =
218222
history.tail.toNel.map { prev =>
@@ -242,11 +246,12 @@ class Game private (val size: Int,
242246
} yield UnDiEdge(idx, n)
243247
Graph.from(xs, edges)
244248
}
245-
val roadStones: Vector[(BoardIndex, Player)] = currentBoard.stacksWithIndex.flatMap { case (idx, stack) =>
246-
stack.top match {
247-
case Some(stone) if stone.isRoadStone => Vector(idx -> stone.owner)
248-
case _ => Vector.empty
249-
}
249+
val roadStones: Vector[(BoardIndex, Player)] = currentBoard.stacksWithIndex.flatMap {
250+
case (idx, stack) =>
251+
stack.top match {
252+
case Some(stone) if stone.isRoadStone => Vector(idx -> stone.owner)
253+
case _ => Vector.empty
254+
}
250255
}
251256
val (whiteRoadStones, blackRoadStones) = roadStones.partition { _._2 == White }
252257
val whiteIndexes = whiteRoadStones.map(_._1)
@@ -276,6 +281,7 @@ class Game private (val size: Int,
276281
}
277282

278283
private def flatWin: Option[FlatResult] = {
284+
import Stone._
279285
val allStacks = currentBoard.boardPositions.flatten.toList
280286
@tailrec
281287
def go(stacks: List[Stack],

taklib/src/main/scala/com/github/daenyth/taklib/Move.scala

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -35,13 +35,13 @@ sealed trait PlayStone extends TurnAction {
3535
def stone: Player => Stone
3636
}
3737
case class PlayFlat(at: BoardIndex) extends PlayStone {
38-
val stone = FlatStone.apply _
38+
val stone = Stone.FlatStone.apply _
3939
}
4040
case class PlayStanding(at: BoardIndex) extends PlayStone {
41-
val stone = StandingStone.apply _
41+
val stone = Stone.StandingStone.apply _
4242
}
4343
case class PlayCapstone(at: BoardIndex) extends PlayStone {
44-
val stone = Capstone.apply _
44+
val stone = Stone.Capstone.apply _
4545
}
4646
case class Move(from: BoardIndex,
4747
direction: MoveDirection,

taklib/src/main/scala/com/github/daenyth/taklib/PtnParser.scala

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,12 +1,13 @@
11
package com.github.daenyth.taklib
22

3+
import com.github.daenyth.taklib.GameEndResult._
34
import com.github.daenyth.taklib.Implicits.RichParsing
45

56
import scala.collection.immutable.VectorBuilder
67
import scala.util.parsing.combinator.RegexParsers
7-
import scalaz.{-\/, \/, \/-}
88
import scalaz.std.vector._
99
import scalaz.syntax.foldable._
10+
import scalaz.{-\/, \/, \/-}
1011

1112
object PtnParser extends RegexParsers with RichParsing {
1213

taklib/src/main/scala/com/github/daenyth/taklib/TpsParser.scala

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
package com.github.daenyth.taklib
22

33
import com.github.daenyth.taklib.Implicits.RichParsing
4+
import com.github.daenyth.taklib.Stone._
45

56
import scala.annotation.tailrec
67
import scala.util.Try

taklib/src/test/scala/com/github/daenyth/taklib/GameTest.scala

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,13 +1,14 @@
11
package com.github.daenyth.taklib
22

3+
import com.github.daenyth.taklib.GameEndResult._
34
import org.scalacheck.{Arbitrary, Gen}
45
import org.scalatest.{FlatSpec, Matchers, OptionValues}
56
import org.typelevel.scalatest.DisjunctionValues
67

78
import scalaz.\/
89
import scalaz.scalacheck.ScalazProperties
9-
import scalaz.syntax.traverse._
1010
import scalaz.std.vector._
11+
import scalaz.syntax.traverse._
1112

1213
object GameTest {
1314
implicit val arbRoad: Arbitrary[RoadWin] = Arbitrary { Gen.oneOf(White, Black).map(RoadWin) }

taklib/src/test/scala/com/github/daenyth/taklib/MoveTest.scala

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
package com.github.daenyth.taklib
22

3+
import com.github.daenyth.taklib.Stone._
34
import org.scalatest.{FlatSpec, Matchers}
45

56
class MoveTest extends FlatSpec with Matchers with MoveResultValues {

taklib/src/test/scala/com/github/daenyth/taklib/PtnParserTest.scala

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
package com.github.daenyth.taklib
22

3+
import com.github.daenyth.taklib.GameEndResult._
34
import com.github.daenyth.taklib.PtnParser.PtnHeaders
45
import org.scalatest.{FlatSpec, Matchers}
56
import org.typelevel.scalatest.DisjunctionValues

0 commit comments

Comments
 (0)