import * as CellSet from Geometry.CellSet; import getCellSets from Solver.State; import * as Strategy from Solver.Strategy; import {diagonal, getColumn, getRow, plus} from Geometry.Vector; return { find: find }; function find(solvingState) { var cellSets = getCellSets(solvingState); return Strategy.map( stepOfCell, Strategy.tryEach(cellSets.map(getSingleCellIn)) ); } function getSingleCellIn(cellSet) { return function() { if(cellSet.size() == 1) { return cellSet.toList()[0]; } }; } function stepOfCell(cell) { return { reason: 'singleCell', empty: toEmpty(cell), star: new CellSet.CellSet(cell) }; } function toEmpty(cell) { var union = CellSet.union([ CellSet.rectangle(plus(cell, diagonal(-1)), diagonal(3)), CellSet.row(getRow(cell)), CellSet.column(getColumn(cell)) ]); union.remove(cell); return union; }