-
Notifications
You must be signed in to change notification settings - Fork 0
/
baduk.dhall
148 lines (120 loc) · 4.73 KB
/
baduk.dhall
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
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
let Prelude = ./Prelude.dhall
let types = ./types.dhall
let Color/eq
: types.Color -> types.Color -> Bool
= \(c1 : types.Color) ->
\(c2 : types.Color) ->
merge
{ Black = merge { Black = True, White = False } c2
, White = merge { Black = False, White = True } c2
}
c1
let Coord/read = (./coord.dhall).read
let Board/toPoints
: types.Board -> types.Color -> List types.Point
= \(board : types.Board) ->
\(color : types.Color) ->
let Row = List (Optional types.Color)
let RowCoord = { index : Natural, value : List types.Coord }
let {- First step converts each row to a List of Coord -}
rowCoords
: types.Board -> List (List types.Coord)
= \(board : types.Board) ->
let RowIndex = { index : Natural, value : Optional types.Color }
let mkRowCoords
: List RowIndex -> List types.Coord
= let empty = Prelude.List.empty types.Coord
let foldRow =
\(cell : RowIndex) ->
merge
{ None = empty
, Some =
\(color : types.Color) ->
if Color/eq color color@1
then merge
{ None = empty
, Some =
\(coord : types.Coord) ->
[ coord ]
}
(Coord/read cell.index)
else empty
}
cell.value
in Prelude.List.concatMap RowIndex types.Coord foldRow
let indexedRows =
Prelude.List.map
Row
(List RowIndex)
(Prelude.List.indexed (Optional types.Color))
board
in Prelude.List.map
(List RowIndex)
(List types.Coord)
mkRowCoords
indexedRows
let indexedRowCoords
: List RowCoord
= Prelude.List.indexed (List types.Coord) (rowCoords board)
let mkPoint
: RowCoord -> List types.Point
= \(row-coord : RowCoord) ->
merge
{ None = Prelude.List.empty types.Point
, Some =
\(y-coord : types.Coord) ->
Prelude.List.map
types.Coord
types.Point
( \(x-coord : types.Coord) ->
{ x = x-coord, y = y-coord }
)
row-coord.value
}
(Coord/read row-coord.index)
in Prelude.List.concatMap RowCoord types.Point mkPoint indexedRowCoords
let b = Some types.Color.Black
let w = Some types.Color.White
let o = None types.Color
let example-board =
[ [ o, o, o, o, o ]
, [ o, o, b, o, o ]
, [ o, b, o, o, o ]
, [ o, o, w, w, w ]
, [ o, o, o, o, o ]
]
let example =
assert
: Board/toPoints example-board types.Color.Black
=== [ { x = types.Coord.c, y = types.Coord.b }
, { x = types.Coord.b, y = types.Coord.c }
]
let size-to-komi
: Natural -> Double
= \(size : Natural) -> if Prelude.Natural.equal size 9 then 3.5 else 0.0
let minimal
: Natural -> types.GameTree
= \(size : Natural) ->
[ types.Property.Game types.GameType.Baduk
, types.Property.Size size
, types.Property.Komi (size-to-komi size)
]
let board
: types.Board -> types.GameTree
= \(board : types.Board) ->
let moves = Board/toPoints board
let size = Prelude.List.length (List (Optional types.Color)) board
let black = moves types.Color.Black
let white = moves types.Color.White
let player =
if Prelude.Natural.greaterThan
(Prelude.List.length types.Point black)
(Prelude.List.length types.Point white)
then types.Color.White
else types.Color.Black
in minimal size
# [ types.Property.BlackMoves black
, types.Property.WhiteMoves white
, types.Property.Player player
]
in { minimal, board }