Skip to content

Commit

Permalink
Again, an API change
Browse files Browse the repository at this point in the history
  • Loading branch information
yishn committed May 13, 2018
1 parent 0ced806 commit 764f5c0
Show file tree
Hide file tree
Showing 6 changed files with 44 additions and 53 deletions.
12 changes: 6 additions & 6 deletions README.md
Expand Up @@ -10,10 +10,10 @@ Use npm to install:
$ npm install @sabaki/deadstones
~~~

This module loads asynchronously, please require it as follows:
To use this module, require it as follows:

~~~js
const deadstones = await require('@sabaki/deadstones');
const deadstones = require('@sabaki/deadstones');
~~~

## Building
Expand Down Expand Up @@ -64,7 +64,7 @@ Board positions are represented by an array of the form `[x, y]` where `x` and `

This module exposes four functions:

### `deadstones.guess(data[, options])`
### `async deadstones.guess(data[, options])`

- `data` - [Board data](#board-data)
- `options` `<Object>` *(optional)*
Expand All @@ -77,21 +77,21 @@ This module exposes four functions:

Returns an array of vertices that Sabaki thinks are dead.

### `deadstones.getProbabilityMap(data, iterations)`
### `async deadstones.getProbabilityMap(data, iterations)`

- `data` - [Board data](#board-data)
- `iterations` `<integer>` - The number of random playthroughs to make.

Returns an array of arrays of the same size as `data`. Each entry is a number between `-1` and `1` and corresponds to a vertex. A number closer to `-1` is more likely controlled by white and a number closer to `1` is more likely controlled by black.

### `deadstones.playTillEnd(data, sign)`
### `async deadstones.playTillEnd(data, sign)`

- `data` - [Board data](#board-data)
- `sign` `-1` | `1` - White player corresponds to `-1`, black player is represented by `1`.

Makes random alternating moves, starting with the player determined by sign, until only eye filling moves can be made. Then all eyes that are left will be filled with the corresponding color. This final board arrangement data will be returned.

### `deadstones.getFloatingStones(data)`
### `async deadstones.getFloatingStones(data)`

- `data` - [Board data](#board-data)

Expand Down
44 changes: 22 additions & 22 deletions js/main.js
@@ -1,3 +1,5 @@
const wasm = require('./wasm')

const parseBoard = data => [
data.reduce((acc, x) => (acc.push(...x), acc), []),
data.length > 0 ? data[0].length : 0
Expand All @@ -14,32 +16,30 @@ const parseGrid = (values, width) => {
.map((_, y) => values.slice(y * width, (y + 1) * width))
}

module.exports = require('./wasm').then(lib => ({
guess: function(data, {finished = false, iterations = 100} = {}) {
let [newData, width] = parseBoard(data)
let indices = lib.guess(newData, width, finished, iterations, Date.now())
exports.guess = async function(data, {finished = false, iterations = 100} = {}) {
let [newData, width] = parseBoard(data)
let indices = (await wasm).guess(newData, width, finished, iterations, Date.now())

return parseVertices(indices, width)
},
return parseVertices(indices, width)
},

playTillEnd: function(data, sign) {
let [newData, width] = parseBoard(data)
let values = lib.play_till_end(newData, width, sign, Date.now())
exports.playTillEnd = async function(data, sign) {
let [newData, width] = parseBoard(data)
let values = (await wasm).play_till_end(newData, width, sign, Date.now())

return parseGrid(values, width)
},
return parseGrid(values, width)
},

getProbabilityMap: function(data, iterations) {
let [newData, width] = parseBoard(data)
let values = lib.get_probability_map(newData, width, iterations, Date.now())
exports.getProbabilityMap = async function(data, iterations) {
let [newData, width] = parseBoard(data)
let values = (await wasm).get_probability_map(newData, width, iterations, Date.now())

return parseGrid(values, width)
},
return parseGrid(values, width)
},

getFloatingStones: function(data) {
let [newData, width] = parseBoard(data)
let indices = lib.get_floating_stones(newData, width)
exports.getFloatingStones = async function(data) {
let [newData, width] = parseBoard(data)
let indices = (await wasm).get_floating_stones(newData, width)

return parseVertices(indices, width)
}
}))
return parseVertices(indices, width)
}
13 changes: 5 additions & 8 deletions tests/getFloatingStones.test.js
@@ -1,20 +1,19 @@
const t = require('tap')
const deadstones = require('..')
const data = require('./data')

t.test('should not mutate board data', async t => {
let deadstones = await require('..')
let boardJSON = JSON.stringify(data.finished)

deadstones.getFloatingStones(data.finished)
await deadstones.getFloatingStones(data.finished)

t.assert(JSON.stringify(data.finished), boardJSON)
t.end()
})

t.test('finished game', async t => {
let deadstones = await require('..')
let floatingStones = await deadstones.getFloatingStones(data.finished)

t.deepEqual(deadstones.getFloatingStones(data.finished).sort(), [
t.deepEqual(floatingStones.sort(), [
[10, 5], [13, 13], [13, 14], [14, 7], [18, 13],
[2, 13], [2, 14], [5, 13], [6, 13], [9, 3], [9, 5]
])
Expand All @@ -23,8 +22,6 @@ t.test('finished game', async t => {
})

t.test('unfinished game', async t => {
let deadstones = await require('..')

t.deepEqual(deadstones.getFloatingStones(data.unfinished), [[0, 1]])
t.deepEqual(await deadstones.getFloatingStones(data.unfinished), [[0, 1]])
t.end()
})
7 changes: 3 additions & 4 deletions tests/getProbabilityMap.test.js
@@ -1,18 +1,17 @@
const t = require('tap')
const deadstones = require('..')
const data = require('./data')

t.test('should not mutate board data', async t => {
let deadstones = await require('..')
let boardJSON = JSON.stringify(data.finished)
deadstones.getProbabilityMap(data.finished, 50)
await deadstones.getProbabilityMap(data.finished, 50)

t.assert(JSON.stringify(data.finished), boardJSON)
t.end()
})

t.test('should contain values between -1 and 1', async t => {
let deadstones = await require('..')
let map = deadstones.getProbabilityMap(data.unfinished, 50)
let map = await deadstones.getProbabilityMap(data.unfinished, 50)

t.assert(map.every(row => row.every(x => -1 <= x && x <= 1)))
t.end()
Expand Down
13 changes: 5 additions & 8 deletions tests/guess.test.js
@@ -1,28 +1,25 @@
const t = require('tap')
const deadstones = require('..')
const data = require('./data')

t.test('should not mutate board data', async t => {
let deadstones = await require('..')
let boardJSON = JSON.stringify(data.finished)

deadstones.guess(data.finished, {finished: true})
await deadstones.guess(data.finished, {finished: true})

t.assert(JSON.stringify(data.finished), boardJSON)
t.end()
})

t.test('should detect some dead stones from unfinished games', async t => {
let deadstones = await require('..')
let dead = deadstones.guess(data.unfinished)
let dead = await deadstones.guess(data.unfinished)

t.assert(dead.length > 0)
t.end()
})

t.test('should detect floating stones from finished games', async t => {
let deadstones = await require('..')
let dead = deadstones.guess(data.finished, {finished: true})
let floating = deadstones.getFloatingStones(data.finished)
let dead = await deadstones.guess(data.finished, {finished: true})
let floating = await deadstones.getFloatingStones(data.finished)

t.assert(floating.every(v => dead.some(([x, y]) => x === v[0] && y === v[1])))
t.end()
Expand Down
8 changes: 3 additions & 5 deletions tests/playTillEnd.test.js
@@ -1,19 +1,17 @@
const t = require('tap')
const deadstones = require('..')
const data = require('./data')

t.test('should not mutate board data', async t => {
let boardJSON = JSON.stringify(data.finished)
let deadstones = await require('..')

deadstones.playTillEnd(data.finished, -1)
await deadstones.playTillEnd(data.finished, -1)

t.assert(JSON.stringify(data.finished), boardJSON)
t.end()
})

t.test('should not have empty vertices', async t => {
let deadstones = await require('..')
let finished = deadstones.playTillEnd(data.unfinished, 1)
let finished = await deadstones.playTillEnd(data.unfinished, 1)

t.assert(finished.every(row => row.every(x => x === 1 || x === -1)))
t.end()
Expand Down

0 comments on commit 764f5c0

Please sign in to comment.