@fgv/ts-sudoku-lib 3.0.1-alpha.6 → 4.0.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.json +27 -0
- package/CHANGELOG.md +16 -1
- package/dist/ts-sudoku-lib.d.ts +7 -7
- package/dist/tsdoc-metadata.json +1 -1
- package/lib/packlets/collections/collections.d.ts +2 -2
- package/lib/packlets/collections/collections.js +2 -2
- package/lib/packlets/collections/collections.js.map +1 -1
- package/lib/packlets/common/converters.d.ts +1 -1
- package/lib/packlets/common/converters.js +1 -1
- package/lib/packlets/common/converters.js.map +1 -1
- package/lib/packlets/common/puzzle.d.ts +1 -1
- package/lib/packlets/common/puzzle.js +1 -1
- package/lib/packlets/common/puzzle.js.map +1 -1
- package/lib/packlets/file/converters.d.ts +2 -2
- package/lib/packlets/file/converters.js +2 -2
- package/lib/packlets/file/converters.js.map +1 -1
- package/lib/packlets/puzzles/anyPuzzle.d.ts +1 -1
- package/lib/packlets/puzzles/anyPuzzle.js +1 -1
- package/lib/packlets/puzzles/anyPuzzle.js.map +1 -1
- package/package.json +16 -16
package/CHANGELOG.json
CHANGED
|
@@ -1,6 +1,33 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@fgv/ts-sudoku-lib",
|
|
3
3
|
"entries": [
|
|
4
|
+
{
|
|
5
|
+
"version": "4.0.1",
|
|
6
|
+
"tag": "@fgv/ts-sudoku-lib_v4.0.1",
|
|
7
|
+
"date": "Tue, 14 May 2024 05:02:20 GMT",
|
|
8
|
+
"comments": {
|
|
9
|
+
"none": [
|
|
10
|
+
{
|
|
11
|
+
"comment": "publish"
|
|
12
|
+
}
|
|
13
|
+
]
|
|
14
|
+
}
|
|
15
|
+
},
|
|
16
|
+
{
|
|
17
|
+
"version": "4.0.0",
|
|
18
|
+
"tag": "@fgv/ts-sudoku-lib_v4.0.0",
|
|
19
|
+
"date": "Tue, 14 May 2024 03:09:27 GMT",
|
|
20
|
+
"comments": {
|
|
21
|
+
"none": [
|
|
22
|
+
{
|
|
23
|
+
"comment": "update dependencies"
|
|
24
|
+
},
|
|
25
|
+
{
|
|
26
|
+
"comment": "update generated api docs"
|
|
27
|
+
}
|
|
28
|
+
]
|
|
29
|
+
}
|
|
30
|
+
},
|
|
4
31
|
{
|
|
5
32
|
"version": "3.0.0",
|
|
6
33
|
"tag": "@fgv/ts-sudoku-lib_v3.0.0",
|
package/CHANGELOG.md
CHANGED
|
@@ -1,6 +1,21 @@
|
|
|
1
1
|
# Change Log - @fgv/ts-sudoku-lib
|
|
2
2
|
|
|
3
|
-
This log was last generated on
|
|
3
|
+
This log was last generated on Tue, 14 May 2024 05:02:20 GMT and should not be manually modified.
|
|
4
|
+
|
|
5
|
+
## 4.0.1
|
|
6
|
+
Tue, 14 May 2024 05:02:20 GMT
|
|
7
|
+
|
|
8
|
+
### Updates
|
|
9
|
+
|
|
10
|
+
- publish
|
|
11
|
+
|
|
12
|
+
## 4.0.0
|
|
13
|
+
Tue, 14 May 2024 03:09:27 GMT
|
|
14
|
+
|
|
15
|
+
### Updates
|
|
16
|
+
|
|
17
|
+
- update dependencies
|
|
18
|
+
- update generated api docs
|
|
4
19
|
|
|
5
20
|
## 3.0.0
|
|
6
21
|
Mon, 22 Jan 2024 07:00:18 GMT
|
package/dist/ts-sudoku-lib.d.ts
CHANGED
|
@@ -9,7 +9,7 @@ import { Result } from '@fgv/ts-utils';
|
|
|
9
9
|
export declare const allPuzzleTypes: PuzzleType[];
|
|
10
10
|
|
|
11
11
|
/**
|
|
12
|
-
* Static class to instantiate any puzzle from a {@link
|
|
12
|
+
* Static class to instantiate any puzzle from a {@link PuzzleDescription | puzzle description}.
|
|
13
13
|
* @internal
|
|
14
14
|
*/
|
|
15
15
|
declare class AnyPuzzle {
|
|
@@ -287,7 +287,7 @@ declare class KillerSudokuPuzzle extends Puzzle {
|
|
|
287
287
|
|
|
288
288
|
/**
|
|
289
289
|
* Loads an arbitrary JSON file and parses it to return a validated
|
|
290
|
-
* {@link
|
|
290
|
+
* {@link File.Model.IPuzzlesFile | IPuzzlesFile}.
|
|
291
291
|
* @param path - String path to the file
|
|
292
292
|
* @returns `Success` with the resulting file, or `Failure` with details if an
|
|
293
293
|
* error occurs.
|
|
@@ -343,7 +343,7 @@ export declare class Puzzle {
|
|
|
343
343
|
protected readonly _cells: Map<CellId, Cell>;
|
|
344
344
|
/**
|
|
345
345
|
* Constructs a new puzzle state.
|
|
346
|
-
* @param puzzle - {@Link
|
|
346
|
+
* @param puzzle - {@Link IPuzzleDescription | Puzzle description} from which this puzzle state
|
|
347
347
|
* is to be initialized.
|
|
348
348
|
*/
|
|
349
349
|
protected constructor(puzzle: IPuzzleDescription, extraCages?: [CageId, Cage][]);
|
|
@@ -403,8 +403,8 @@ export declare class PuzzleCollection {
|
|
|
403
403
|
private readonly _byId;
|
|
404
404
|
private constructor();
|
|
405
405
|
/**
|
|
406
|
-
* Creates a new puzzle from a loaded {@link
|
|
407
|
-
* @param from - The {@link
|
|
406
|
+
* Creates a new puzzle from a loaded {@link File.Model.IPuzzlesFile | PuzzlesFile}
|
|
407
|
+
* @param from - The {@link File.Model.IPuzzlesFile | puzzles file} to be loaded.
|
|
408
408
|
* @returns `Success` with the resulting {@link PuzzleCollection | PuzzleCollection}
|
|
409
409
|
* or `Failure` with details if an error occurs.
|
|
410
410
|
*/
|
|
@@ -445,7 +445,7 @@ export declare class PuzzleCollections {
|
|
|
445
445
|
}
|
|
446
446
|
|
|
447
447
|
/**
|
|
448
|
-
* Converts an arbitrary object to a {@link
|
|
448
|
+
* Converts an arbitrary object to a {@link IPuzzleDescription | IPuzzleDescription}.
|
|
449
449
|
* @public
|
|
450
450
|
*/
|
|
451
451
|
declare const puzzleDescription: Converter<IPuzzleDescription>;
|
|
@@ -666,7 +666,7 @@ export declare class PuzzleSession {
|
|
|
666
666
|
}
|
|
667
667
|
|
|
668
668
|
/**
|
|
669
|
-
* Converts an arbitrary object to a {@link
|
|
669
|
+
* Converts an arbitrary object to a {@link File.Model.IPuzzlesFile | IPuzzlesFile}.
|
|
670
670
|
* @public
|
|
671
671
|
*/
|
|
672
672
|
declare const puzzlesFile: Converter<IPuzzlesFile>;
|
package/dist/tsdoc-metadata.json
CHANGED
|
@@ -13,8 +13,8 @@ export declare class PuzzleCollection {
|
|
|
13
13
|
private readonly _byId;
|
|
14
14
|
private constructor();
|
|
15
15
|
/**
|
|
16
|
-
* Creates a new puzzle from a loaded {@link
|
|
17
|
-
* @param from - The {@link
|
|
16
|
+
* Creates a new puzzle from a loaded {@link File.Model.IPuzzlesFile | PuzzlesFile}
|
|
17
|
+
* @param from - The {@link File.Model.IPuzzlesFile | puzzles file} to be loaded.
|
|
18
18
|
* @returns `Success` with the resulting {@link PuzzleCollection | PuzzleCollection}
|
|
19
19
|
* or `Failure` with details if an error occurs.
|
|
20
20
|
*/
|
|
@@ -67,8 +67,8 @@ class PuzzleCollection {
|
|
|
67
67
|
.filter((p) => p !== undefined));
|
|
68
68
|
}
|
|
69
69
|
/**
|
|
70
|
-
* Creates a new puzzle from a loaded {@link
|
|
71
|
-
* @param from - The {@link
|
|
70
|
+
* Creates a new puzzle from a loaded {@link File.Model.IPuzzlesFile | PuzzlesFile}
|
|
71
|
+
* @param from - The {@link File.Model.IPuzzlesFile | puzzles file} to be loaded.
|
|
72
72
|
* @returns `Success` with the resulting {@link PuzzleCollection | PuzzleCollection}
|
|
73
73
|
* or `Failure` with details if an error occurs.
|
|
74
74
|
*/
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"collections.js","sourceRoot":"","sources":["../../../src/packlets/collections/collections.ts"],"names":[],"mappings":";AAAA;;;;;;;;;;;;;;;;;;;;;;GAsBG;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAEH,kDAAoC;AACpC,oDAAsC;AAEtC,4CAAqE;AAErE,sCAA8D;AAC9D,uEAAiD;AAEjD;;;GAGG;AACH,MAAa,gBAAgB;IAQ3B,YAAoB,OAAoC;QACtD,IAAI,CAAC,OAAO,GAAG,OAAO,CAAC,OAAO,CAAC;QAC/B,IAAI,CAAC,KAAK,GAAG,IAAI,GAAG,CAClB,IAAI,CAAC,OAAO;aACT,GAAG,CAAC,CAAC,CAAC,EAA4C,EAAE,CAAC,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC;aAC/D,MAAM,CAAC,CAAC,CAAC,EAAqC,EAAE,CAAC,CAAC,KAAK,SAAS,CAAC,CACrE,CAAC;IACJ,CAAC;IAED;;;;;OAKG;IACI,MAAM,CAAC,MAAM,CAAC,IAAiC;QACpD,OAAO,IAAA,wBAAa,EAAC,GAAG,EAAE,CAAC,IAAI,gBAAgB,CAAC,IAAI,CAAC,CAAC,CAAC;IACzD,CAAC;IAED;;;;;OAKG;IACI,MAAM,CAAC,IAAI,CAAC,IAAY;QAC7B,OAAO,QAAQ,CAAC,UAAU,CAAC,uBAAuB,CAAC,IAAI,CAAC,CAAC,SAAS,CAAC,gBAAgB,CAAC,MAAM,CAAC,CAAC;IAC9F,CAAC;IAED;;;;;OAKG;IACI,SAAS,CAAC,EAAU;QACzB,OAAO,IAAI,CAAC,cAAc,CAAC,EAAE,CAAC;aAC3B,SAAS,CAAC,CAAC,IAAI,EAAE,EAAE;YAClB,OAAO,OAAO,CAAC,GAAG,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC;QAClC,CAAC,CAAC;aACD,SAAS,CAAC,CAAC,MAAM,EAAE,EAAE;YACpB,OAAO,sBAAa,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC;QACtC,CAAC,CAAC,CAAC;IACP,CAAC;IAED;;;;;OAKG;IACI,cAAc,CAAC,EAAU;QAC9B,MAAM,IAAI,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;QAChC,IAAI,CAAC,IAAI,EAAE,CAAC;YACV,OAAO,IAAA,eAAI,EAAC,WAAW,EAAE,aAAa,CAAC,CAAC;QAC1C,CAAC;QACD,OAAO,IAAA,kBAAO,EAAC,IAAI,CAAC,CAAC;IACvB,CAAC;CACF;AAlED,4CAkEC;AAED;;;GAGG;AACH,MAAa,iBAAiB;IAG5B;;OAEG;IACI,MAAM,KAAK,OAAO;QACvB,IAAI,CAAC,iBAAiB,CAAC,QAAQ,EAAE,CAAC;YAChC,iBAAiB,CAAC,QAAQ,GAAG,QAAQ,CAAC,UAAU,CAAC,WAAW;iBACzD,OAAO,CAAC,sBAAc,CAAC;iBACvB,SAAS,CAAC,gBAAgB,CAAC,MAAM,CAAC;iBAClC,OAAO,EAAE,CAAC;QACf,CAAC;QACD,OAAO,iBAAiB,CAAC,QAAQ,CAAC;IACpC,CAAC;;AAdH,8CAeC;AAdgB,0BAAQ,GAAiC,SAAS,CAAC","sourcesContent":["/*\n * MIT License\n *\n * Copyright (c) 2023 Erik Fortune\n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in all\n * copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\n * SOFTWARE.\n */\n\nimport * as FileData from '../file';\nimport * as Puzzles from '../puzzles';\n\nimport { Result, captureResult, fail, succeed } from '@fgv/ts-utils';\n\nimport { IPuzzleDescription, PuzzleSession } from '../common';\nimport DefaultPuzzles from './data/puzzles.json';\n\n/**\n * A collection of puzzles of various types.\n * @public\n */\nexport class PuzzleCollection {\n /**\n * All puzzles in the collection.\n */\n public readonly puzzles: readonly IPuzzleDescription[];\n\n private readonly _byId: Map<string, IPuzzleDescription>;\n\n private constructor(puzzles: FileData.Model.IPuzzlesFile) {\n this.puzzles = puzzles.puzzles;\n this._byId = new Map(\n this.puzzles\n .map((p): [string | undefined, IPuzzleDescription] => [p.id, p])\n .filter((p): p is [string, IPuzzleDescription] => p !== undefined)\n );\n }\n\n /**\n * Creates a new puzzle from a loaded {@link
|
|
1
|
+
{"version":3,"file":"collections.js","sourceRoot":"","sources":["../../../src/packlets/collections/collections.ts"],"names":[],"mappings":";AAAA;;;;;;;;;;;;;;;;;;;;;;GAsBG;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAEH,kDAAoC;AACpC,oDAAsC;AAEtC,4CAAqE;AAErE,sCAA8D;AAC9D,uEAAiD;AAEjD;;;GAGG;AACH,MAAa,gBAAgB;IAQ3B,YAAoB,OAAoC;QACtD,IAAI,CAAC,OAAO,GAAG,OAAO,CAAC,OAAO,CAAC;QAC/B,IAAI,CAAC,KAAK,GAAG,IAAI,GAAG,CAClB,IAAI,CAAC,OAAO;aACT,GAAG,CAAC,CAAC,CAAC,EAA4C,EAAE,CAAC,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC;aAC/D,MAAM,CAAC,CAAC,CAAC,EAAqC,EAAE,CAAC,CAAC,KAAK,SAAS,CAAC,CACrE,CAAC;IACJ,CAAC;IAED;;;;;OAKG;IACI,MAAM,CAAC,MAAM,CAAC,IAAiC;QACpD,OAAO,IAAA,wBAAa,EAAC,GAAG,EAAE,CAAC,IAAI,gBAAgB,CAAC,IAAI,CAAC,CAAC,CAAC;IACzD,CAAC;IAED;;;;;OAKG;IACI,MAAM,CAAC,IAAI,CAAC,IAAY;QAC7B,OAAO,QAAQ,CAAC,UAAU,CAAC,uBAAuB,CAAC,IAAI,CAAC,CAAC,SAAS,CAAC,gBAAgB,CAAC,MAAM,CAAC,CAAC;IAC9F,CAAC;IAED;;;;;OAKG;IACI,SAAS,CAAC,EAAU;QACzB,OAAO,IAAI,CAAC,cAAc,CAAC,EAAE,CAAC;aAC3B,SAAS,CAAC,CAAC,IAAI,EAAE,EAAE;YAClB,OAAO,OAAO,CAAC,GAAG,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC;QAClC,CAAC,CAAC;aACD,SAAS,CAAC,CAAC,MAAM,EAAE,EAAE;YACpB,OAAO,sBAAa,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC;QACtC,CAAC,CAAC,CAAC;IACP,CAAC;IAED;;;;;OAKG;IACI,cAAc,CAAC,EAAU;QAC9B,MAAM,IAAI,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;QAChC,IAAI,CAAC,IAAI,EAAE,CAAC;YACV,OAAO,IAAA,eAAI,EAAC,WAAW,EAAE,aAAa,CAAC,CAAC;QAC1C,CAAC;QACD,OAAO,IAAA,kBAAO,EAAC,IAAI,CAAC,CAAC;IACvB,CAAC;CACF;AAlED,4CAkEC;AAED;;;GAGG;AACH,MAAa,iBAAiB;IAG5B;;OAEG;IACI,MAAM,KAAK,OAAO;QACvB,IAAI,CAAC,iBAAiB,CAAC,QAAQ,EAAE,CAAC;YAChC,iBAAiB,CAAC,QAAQ,GAAG,QAAQ,CAAC,UAAU,CAAC,WAAW;iBACzD,OAAO,CAAC,sBAAc,CAAC;iBACvB,SAAS,CAAC,gBAAgB,CAAC,MAAM,CAAC;iBAClC,OAAO,EAAE,CAAC;QACf,CAAC;QACD,OAAO,iBAAiB,CAAC,QAAQ,CAAC;IACpC,CAAC;;AAdH,8CAeC;AAdgB,0BAAQ,GAAiC,SAAS,CAAC","sourcesContent":["/*\n * MIT License\n *\n * Copyright (c) 2023 Erik Fortune\n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in all\n * copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\n * SOFTWARE.\n */\n\nimport * as FileData from '../file';\nimport * as Puzzles from '../puzzles';\n\nimport { Result, captureResult, fail, succeed } from '@fgv/ts-utils';\n\nimport { IPuzzleDescription, PuzzleSession } from '../common';\nimport DefaultPuzzles from './data/puzzles.json';\n\n/**\n * A collection of puzzles of various types.\n * @public\n */\nexport class PuzzleCollection {\n /**\n * All puzzles in the collection.\n */\n public readonly puzzles: readonly IPuzzleDescription[];\n\n private readonly _byId: Map<string, IPuzzleDescription>;\n\n private constructor(puzzles: FileData.Model.IPuzzlesFile) {\n this.puzzles = puzzles.puzzles;\n this._byId = new Map(\n this.puzzles\n .map((p): [string | undefined, IPuzzleDescription] => [p.id, p])\n .filter((p): p is [string, IPuzzleDescription] => p !== undefined)\n );\n }\n\n /**\n * Creates a new puzzle from a loaded {@link File.Model.IPuzzlesFile | PuzzlesFile}\n * @param from - The {@link File.Model.IPuzzlesFile | puzzles file} to be loaded.\n * @returns `Success` with the resulting {@link PuzzleCollection | PuzzleCollection}\n * or `Failure` with details if an error occurs.\n */\n public static create(from: FileData.Model.IPuzzlesFile): Result<PuzzleCollection> {\n return captureResult(() => new PuzzleCollection(from));\n }\n\n /**\n * Creates a new puzzle from a JSON file.\n * @param path - path to the JSON file to be loaded.\n * @returns `Success` with the resulting {@link PuzzleCollection | PuzzleCollection}\n * or `Failure` with details if an error occurs.\n */\n public static load(path: string): Result<PuzzleCollection> {\n return FileData.Converters.loadJsonPuzzlesFileSync(path).onSuccess(PuzzleCollection.create);\n }\n\n /**\n * Gets a puzzle by id from this collection.\n * @param id - The string ID of the puzzle to be returned.\n * @returns `Success` with the requested {@link PuzzleSession | puzzle}, or\n * `Failure` with details if an error occurs.\n */\n public getPuzzle(id: string): Result<PuzzleSession> {\n return this.getDescription(id)\n .onSuccess((desc) => {\n return Puzzles.Any.create(desc);\n })\n .onSuccess((puzzle) => {\n return PuzzleSession.create(puzzle);\n });\n }\n\n /**\n * Gets a puzzle by id from this collection.\n * @param id - The string ID of the puzzle to be returned.\n * @returns `Success` with the requested {@link PuzzleSession | puzzle}, or\n * `Failure` with details if an error occurs.\n */\n public getDescription(id: string): Result<IPuzzleDescription> {\n const desc = this._byId.get(id);\n if (!desc) {\n return fail(`Puzzle \"${id}\" not found`);\n }\n return succeed(desc);\n }\n}\n\n/**\n * Get well-known {@link PuzzleCollection | puzzle collections}.\n * @public\n */\nexport class PuzzleCollections {\n private static _default: PuzzleCollection | undefined = undefined;\n\n /**\n * The default {@link PuzzleCollection | puzzle collection}.\n */\n public static get default(): PuzzleCollection {\n if (!PuzzleCollections._default) {\n PuzzleCollections._default = FileData.Converters.puzzlesFile\n .convert(DefaultPuzzles)\n .onSuccess(PuzzleCollection.create)\n .orThrow();\n }\n return PuzzleCollections._default;\n }\n}\n"]}
|
|
@@ -17,7 +17,7 @@ export declare const cellId: Converter<CellId>;
|
|
|
17
17
|
*/
|
|
18
18
|
export declare const puzzleType: Converter<PuzzleType, PuzzleType[]>;
|
|
19
19
|
/**
|
|
20
|
-
* Converts an arbitrary object to a {@link
|
|
20
|
+
* Converts an arbitrary object to a {@link IPuzzleDescription | IPuzzleDescription}.
|
|
21
21
|
* @public
|
|
22
22
|
*/
|
|
23
23
|
export declare const puzzleDescription: Converter<IPuzzleDescription>;
|
|
@@ -56,7 +56,7 @@ exports.cellId = ts_utils_1.Converters.string.map(validateCellId);
|
|
|
56
56
|
*/
|
|
57
57
|
exports.puzzleType = ts_utils_1.Converters.enumeratedValue(common_1.allPuzzleTypes);
|
|
58
58
|
/**
|
|
59
|
-
* Converts an arbitrary object to a {@link
|
|
59
|
+
* Converts an arbitrary object to a {@link IPuzzleDescription | IPuzzleDescription}.
|
|
60
60
|
* @public
|
|
61
61
|
*/
|
|
62
62
|
exports.puzzleDescription = ts_utils_1.Converters.strictObject({
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"converters.js","sourceRoot":"","sources":["../../../src/packlets/common/converters.ts"],"names":[],"mappings":";AAAA;;;;;;;;;;;;;;;;;;;;;;GAsBG;;;AAEH,4CAA6E;AAC7E,qCAAsE;AAGtE,MAAM,YAAY,GAAW,4DAA4D,CAAC;AAE1F,SAAS,cAAc,CAAC,IAAY;IAClC,IAAI,YAAY,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC;QAC5B,OAAO,IAAA,kBAAO,EAAC,IAAc,CAAC,CAAC;IACjC,CAAC;IACD,OAAO,IAAA,eAAI,EAAC,sBAAsB,IAAI,kDAAkD,CAAC,CAAC;AAC5F,CAAC;AAED,MAAM,YAAY,GAAW,cAAc,CAAC;AAC5C,SAAS,cAAc,CAAC,IAAY;IAClC,IAAI,YAAY,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC;QAC5B,OAAO,IAAA,kBAAO,EAAC,IAAc,CAAC,CAAC;IACjC,CAAC;IACD,OAAO,IAAA,eAAI,EAAC,sBAAsB,IAAI,2BAA2B,CAAC,CAAC;AACrE,CAAC;AAED;;;GAGG;AACU,QAAA,MAAM,GAAsB,qBAAU,CAAC,MAAM,CAAC,GAAG,CAAC,cAAc,CAAC,CAAC;AAE/E;;;GAGG;AACU,QAAA,MAAM,GAAsB,qBAAU,CAAC,MAAM,CAAC,GAAG,CAAC,cAAc,CAAC,CAAC;AAE/E;;;GAGG;AACU,QAAA,UAAU,GACrB,qBAAU,CAAC,eAAe,CAAa,uBAAc,CAAC,CAAC;AAEzD;;;GAGG;AACU,QAAA,iBAAiB,GAAkC,qBAAU,CAAC,YAAY,CACrF;IACE,EAAE,EAAE,qBAAU,CAAC,MAAM;IACrB,WAAW,EAAE,qBAAU,CAAC,MAAM;IAC9B,IAAI,EAAE,kBAAU;IAChB,KAAK,EAAE,qBAAU,CAAC,MAAM;IACxB,IAAI,EAAE,qBAAU,CAAC,MAAM;IACvB,IAAI,EAAE,qBAAU,CAAC,MAAM;IACvB,KAAK,EAAE,qBAAU,CAAC,KAAK,CAAC,CAAC,qBAAU,CAAC,MAAM,EAAE,qBAAU,CAAC,WAAW,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,IAAA,kBAAO,EAAC,CAAC,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC;CACrG,EACD;IACE,cAAc,EAAE,CAAC,IAAI,CAAC;CACvB,CACF,CAAC","sourcesContent":["/*\n * MIT License\n *\n * Copyright (c) 2023 Erik Fortune\n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in all\n * copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\n * SOFTWARE.\n */\n\nimport { Converter, Converters, Result, fail, succeed } from '@fgv/ts-utils';\nimport { CageId, CellId, PuzzleType, allPuzzleTypes } from './common';\nimport { IPuzzleDescription } from './model';\n\nconst cageIdRegExp: RegExp = /^(R[A-Z]$)|(C[0-9]$)|(S[A-Z][0-9]$)|(X[1-2]$)|(K[A-Za-z]$)/;\n\nfunction validateCageId(from: string): Result<CageId> {\n if (cageIdRegExp.test(from)) {\n return succeed(from as CageId);\n }\n return fail(`malformed cage ID \"${from}\" (expected \"R[A-Z]\", \"C[0-9]\" or \"S[A-Z][0-9]\")`);\n}\n\nconst cellIdRegExp: RegExp = /^[A-Z][0-9]$/;\nfunction validateCellId(from: string): Result<CellId> {\n if (cellIdRegExp.test(from)) {\n return succeed(from as CellId);\n }\n return fail(`malformed cell ID \"${from}\" (expected \"[A-Z][0-9]\")`);\n}\n\n/**\n * Converts an arbitrary value to a {@link CageId | CageId}.\n * @public\n */\nexport const cageId: Converter<CageId> = Converters.string.map(validateCageId);\n\n/**\n * Converts an arbitrary value to a {@link CellId | CellId}.\n * @public\n */\nexport const cellId: Converter<CellId> = Converters.string.map(validateCellId);\n\n/**\n * Converts an arbitrary value to a {@link PuzzleType | PuzzleType}.\n * @public\n */\nexport const puzzleType: Converter<PuzzleType, PuzzleType[]> =\n Converters.enumeratedValue<PuzzleType>(allPuzzleTypes);\n\n/**\n * Converts an arbitrary object to a {@link
|
|
1
|
+
{"version":3,"file":"converters.js","sourceRoot":"","sources":["../../../src/packlets/common/converters.ts"],"names":[],"mappings":";AAAA;;;;;;;;;;;;;;;;;;;;;;GAsBG;;;AAEH,4CAA6E;AAC7E,qCAAsE;AAGtE,MAAM,YAAY,GAAW,4DAA4D,CAAC;AAE1F,SAAS,cAAc,CAAC,IAAY;IAClC,IAAI,YAAY,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC;QAC5B,OAAO,IAAA,kBAAO,EAAC,IAAc,CAAC,CAAC;IACjC,CAAC;IACD,OAAO,IAAA,eAAI,EAAC,sBAAsB,IAAI,kDAAkD,CAAC,CAAC;AAC5F,CAAC;AAED,MAAM,YAAY,GAAW,cAAc,CAAC;AAC5C,SAAS,cAAc,CAAC,IAAY;IAClC,IAAI,YAAY,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC;QAC5B,OAAO,IAAA,kBAAO,EAAC,IAAc,CAAC,CAAC;IACjC,CAAC;IACD,OAAO,IAAA,eAAI,EAAC,sBAAsB,IAAI,2BAA2B,CAAC,CAAC;AACrE,CAAC;AAED;;;GAGG;AACU,QAAA,MAAM,GAAsB,qBAAU,CAAC,MAAM,CAAC,GAAG,CAAC,cAAc,CAAC,CAAC;AAE/E;;;GAGG;AACU,QAAA,MAAM,GAAsB,qBAAU,CAAC,MAAM,CAAC,GAAG,CAAC,cAAc,CAAC,CAAC;AAE/E;;;GAGG;AACU,QAAA,UAAU,GACrB,qBAAU,CAAC,eAAe,CAAa,uBAAc,CAAC,CAAC;AAEzD;;;GAGG;AACU,QAAA,iBAAiB,GAAkC,qBAAU,CAAC,YAAY,CACrF;IACE,EAAE,EAAE,qBAAU,CAAC,MAAM;IACrB,WAAW,EAAE,qBAAU,CAAC,MAAM;IAC9B,IAAI,EAAE,kBAAU;IAChB,KAAK,EAAE,qBAAU,CAAC,MAAM;IACxB,IAAI,EAAE,qBAAU,CAAC,MAAM;IACvB,IAAI,EAAE,qBAAU,CAAC,MAAM;IACvB,KAAK,EAAE,qBAAU,CAAC,KAAK,CAAC,CAAC,qBAAU,CAAC,MAAM,EAAE,qBAAU,CAAC,WAAW,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,IAAA,kBAAO,EAAC,CAAC,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC;CACrG,EACD;IACE,cAAc,EAAE,CAAC,IAAI,CAAC;CACvB,CACF,CAAC","sourcesContent":["/*\n * MIT License\n *\n * Copyright (c) 2023 Erik Fortune\n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in all\n * copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\n * SOFTWARE.\n */\n\nimport { Converter, Converters, Result, fail, succeed } from '@fgv/ts-utils';\nimport { CageId, CellId, PuzzleType, allPuzzleTypes } from './common';\nimport { IPuzzleDescription } from './model';\n\nconst cageIdRegExp: RegExp = /^(R[A-Z]$)|(C[0-9]$)|(S[A-Z][0-9]$)|(X[1-2]$)|(K[A-Za-z]$)/;\n\nfunction validateCageId(from: string): Result<CageId> {\n if (cageIdRegExp.test(from)) {\n return succeed(from as CageId);\n }\n return fail(`malformed cage ID \"${from}\" (expected \"R[A-Z]\", \"C[0-9]\" or \"S[A-Z][0-9]\")`);\n}\n\nconst cellIdRegExp: RegExp = /^[A-Z][0-9]$/;\nfunction validateCellId(from: string): Result<CellId> {\n if (cellIdRegExp.test(from)) {\n return succeed(from as CellId);\n }\n return fail(`malformed cell ID \"${from}\" (expected \"[A-Z][0-9]\")`);\n}\n\n/**\n * Converts an arbitrary value to a {@link CageId | CageId}.\n * @public\n */\nexport const cageId: Converter<CageId> = Converters.string.map(validateCageId);\n\n/**\n * Converts an arbitrary value to a {@link CellId | CellId}.\n * @public\n */\nexport const cellId: Converter<CellId> = Converters.string.map(validateCellId);\n\n/**\n * Converts an arbitrary value to a {@link PuzzleType | PuzzleType}.\n * @public\n */\nexport const puzzleType: Converter<PuzzleType, PuzzleType[]> =\n Converters.enumeratedValue<PuzzleType>(allPuzzleTypes);\n\n/**\n * Converts an arbitrary object to a {@link IPuzzleDescription | IPuzzleDescription}.\n * @public\n */\nexport const puzzleDescription: Converter<IPuzzleDescription> = Converters.strictObject<IPuzzleDescription>(\n {\n id: Converters.string,\n description: Converters.string,\n type: puzzleType,\n level: Converters.number,\n rows: Converters.number,\n cols: Converters.number,\n cells: Converters.oneOf([Converters.string, Converters.stringArray.map((s) => succeed(s.join('')))])\n },\n {\n optionalFields: ['id']\n }\n);\n"]}
|
|
@@ -49,7 +49,7 @@ export declare class Puzzle {
|
|
|
49
49
|
protected readonly _cells: Map<CellId, Cell>;
|
|
50
50
|
/**
|
|
51
51
|
* Constructs a new puzzle state.
|
|
52
|
-
* @param puzzle - {@Link
|
|
52
|
+
* @param puzzle - {@Link IPuzzleDescription | Puzzle description} from which this puzzle state
|
|
53
53
|
* is to be initialized.
|
|
54
54
|
*/
|
|
55
55
|
protected constructor(puzzle: IPuzzleDescription, extraCages?: [CageId, Cage][]);
|
|
@@ -36,7 +36,7 @@ const basicCageTotal = 45;
|
|
|
36
36
|
class Puzzle {
|
|
37
37
|
/**
|
|
38
38
|
* Constructs a new puzzle state.
|
|
39
|
-
* @param puzzle - {@Link
|
|
39
|
+
* @param puzzle - {@Link IPuzzleDescription | Puzzle description} from which this puzzle state
|
|
40
40
|
* is to be initialized.
|
|
41
41
|
*/
|
|
42
42
|
constructor(puzzle, extraCages) {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"puzzle.js","sourceRoot":"","sources":["../../../src/packlets/common/puzzle.ts"],"names":[],"mappings":"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","sourcesContent":["/*\n * MIT License\n *\n * Copyright (c) 2023 Erik Fortune\n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in all\n * copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\n * SOFTWARE.\n */\n\nimport { Result, fail, mapResults, succeed } from '@fgv/ts-utils';\nimport {\n CageId,\n CellId,\n ICellContents,\n ICellState,\n IRowColumn,\n NavigationDirection,\n NavigationWrap\n} from './common';\n\nimport { Cage } from './cage';\nimport { Cell } from './cell';\nimport { Ids } from './ids';\nimport { IPuzzleDescription } from './model';\nimport { ICell } from './public';\nimport { PuzzleState } from './puzzleState';\n\nconst basicCageTotal: number = 45;\n\n/**\n * @internal\n */\nexport interface ICellUpdate {\n from: ICellState;\n to: ICellState;\n}\n\n/**\n * @internal\n */\nexport interface IPuzzleUpdate {\n from: PuzzleState;\n to: PuzzleState;\n cells: ICellUpdate[];\n}\n\n/**\n * @internal\n */\nexport class Puzzle {\n public readonly id?: string;\n public readonly description: string;\n public readonly initialState: PuzzleState;\n\n /**\n * @internal\n */\n protected readonly _rows: Map<CageId, Cage>;\n\n /**\n * @internal\n */\n protected readonly _columns: Map<CageId, Cage>;\n\n /**\n * @internal\n */\n protected readonly _sections: Map<CageId, Cage>;\n\n /**\n * @internal\n */\n protected readonly _cages: Map<CageId, Cage>;\n\n /**\n * @internal\n */\n protected readonly _cells: Map<CellId, Cell>;\n\n /**\n * Constructs a new puzzle state.\n * @param puzzle - {@Link Data.Model.PuzzleDescription | Puzzle description} from which this puzzle state\n * is to be initialized.\n */\n protected constructor(puzzle: IPuzzleDescription, extraCages?: [CageId, Cage][]) {\n /* c8 ignore next - ?? is defense in depth */\n extraCages = extraCages ?? [];\n\n if (puzzle.rows !== 9) {\n throw new Error(`Puzzle '${puzzle.description}' unsupported row count ${puzzle.rows}`);\n }\n if (puzzle.cols !== 9) {\n throw new Error(`Puzzle '${puzzle.description}' unsupported column count ${puzzle.cols}`);\n }\n if (puzzle.cells.length !== puzzle.rows * puzzle.cols) {\n throw new Error(\n `Puzzle '${puzzle.description}\" expected ${puzzle.rows * puzzle.cols} cells, found ${\n puzzle.cells.length\n }`\n );\n }\n\n this.id = puzzle.id;\n this.description = puzzle.description;\n\n const rows = Puzzle._createRowCages(puzzle.rows, puzzle.cols).orThrow();\n const columns = Puzzle._createColumnCages(puzzle.rows, puzzle.cols).orThrow();\n const sections = Puzzle._createSectionCages(puzzle.rows, puzzle.cols).orThrow();\n const cages = [...rows, ...columns, ...sections, ...extraCages];\n this._rows = new Map(rows);\n this._columns = new Map(columns);\n this._sections = new Map(sections);\n this._cages = new Map(cages);\n this._cells = new Map();\n\n const cellInit = [...puzzle.cells];\n for (let row = 0; row < this._rows.size; row++) {\n const rowCage = this.getRow(row).orThrow();\n for (let col = 0; col < this._columns.size; col++) {\n const id = Ids.cellId({ row, col }).orThrow();\n const colCage = this.getColumn(col).orThrow();\n const sectionCage = this.getSection({ row, col }).orThrow();\n const otherCages = extraCages.filter(([__key, cage]) => cage.containsCell(id));\n\n const init = cellInit.shift();\n /* c8 ignore next - defense in depth/make type check happy. undefined init should never happen */\n const immutableValue = init === '.' ? undefined : Number.parseInt(init ?? '0');\n if (\n immutableValue !== undefined &&\n (Number.isNaN(immutableValue) || immutableValue < 1 || immutableValue > 9)\n ) {\n throw new Error(`Puzzle ${puzzle.description} illegal value \"${init}\" for cell ${id}`);\n }\n const cages = [rowCage, colCage, sectionCage, ...otherCages.map(([__key, state]) => state)];\n const cell = new Cell({ id, immutableValue, row, col }, cages);\n this._cells.set(id, cell);\n }\n }\n\n this.initialState = PuzzleState.create(\n Array.from(this._cells.entries()).map(([id, state]): ICellState => {\n return { id, value: state.immutableValue, notes: [] };\n })\n ).orThrow();\n }\n\n public get numRows(): number {\n return this._rows.size;\n }\n\n public get numColumns(): number {\n return this._columns.size;\n }\n\n public get rows(): Cage[] {\n return Array.from(this._rows.values());\n }\n\n public get cols(): Cage[] {\n return Array.from(this._columns.values());\n }\n\n public get sections(): Cage[] {\n return Array.from(this._sections.values());\n }\n\n public get cages(): Cage[] {\n return Array.from(this._cages.values());\n }\n\n public get cells(): Cell[] {\n return Array.from(this._cells.values());\n }\n\n /**\n * @internal\n */\n protected static _createRowCages(numRows: number, numCols: number): Result<[CageId, Cage][]> {\n const cages: [CageId, Cage][] = [];\n for (let r = 0; r < numRows; r++) {\n const id = Ids.rowCageId(r);\n const cellIds = Ids.cellIds(r, 1, 0, numCols);\n /* c8 ignore next 3 - defense in depth should never happen */\n if (cellIds.isFailure()) {\n return fail(cellIds.message);\n }\n\n const result = Cage.create(id, 'row', basicCageTotal, cellIds.value).onSuccess((cage) => {\n cages.push([id, cage]);\n return succeed(cage);\n });\n /* c8 ignore next 3 - defense in depth should never happen */\n if (result.isFailure()) {\n return fail(result.message);\n }\n }\n return succeed(cages);\n }\n\n /**\n * @internal\n */\n protected static _createColumnCages(numRows: number, numCols: number): Result<[CageId, Cage][]> {\n const cages: [CageId, Cage][] = [];\n for (let c = 0; c < numCols; c++) {\n const id = Ids.columnCageId(c);\n const cellIds = Ids.cellIds(0, numRows, c, 1);\n /* c8 ignore next 3 - defense in depth should never happen */\n if (cellIds.isFailure()) {\n return fail(cellIds.message);\n }\n\n const result = Cage.create(id, 'column', basicCageTotal, cellIds.value).onSuccess((cage) => {\n cages.push([id, cage]);\n return succeed(cage);\n });\n /* c8 ignore next 3 - defense in depth should never happen */\n if (result.isFailure()) {\n return fail(result.message);\n }\n }\n return succeed(cages);\n }\n\n /**\n * @internal\n */\n private static _createSectionCages(numRows: number, numCols: number): Result<[CageId, Cage][]> {\n const cages: [CageId, Cage][] = [];\n for (let r = 0; r < numRows; r += 3) {\n for (let c = 0; c < numCols; c += 3) {\n const id = Ids.sectionCageId(r, c);\n const cellIds = Ids.cellIds(r, 3, c, 3);\n /* c8 ignore next 3 - defense in depth should never happen */\n if (cellIds.isFailure()) {\n return fail(cellIds.message);\n }\n\n const result = Cage.create(id, 'section', basicCageTotal, cellIds.value).onSuccess((cage) => {\n cages.push([id, cage]);\n return succeed(cage);\n });\n /* c8 ignore next 3 - defense in depth should never happen */\n if (result.isFailure()) {\n return fail(result.message);\n }\n }\n }\n return succeed(cages);\n }\n\n public checkIsSolved(state: PuzzleState): boolean {\n for (const id of this._cells.keys()) {\n if (!state.hasValue(id)) {\n return false;\n }\n }\n for (const cell of this._cells.values()) {\n if (!cell.isValid(state)) {\n return false;\n }\n }\n return true;\n }\n\n public checkIsValid(state: PuzzleState): boolean {\n for (const cell of this._cells.values()) {\n if (!cell.isValid(state)) {\n return false;\n }\n }\n return true;\n }\n\n public getEmptyCells(state: PuzzleState): Cell[] {\n return Array.from(this._cells.values()).filter((c) => !state.hasValue(c.id));\n }\n\n public getInvalidCells(state: PuzzleState): Cell[] {\n return Array.from(this._cells.values()).filter((c) => !c.isValid(state));\n }\n\n public getCellContents(\n spec: string | IRowColumn,\n state: PuzzleState\n ): Result<{ cell: Cell; contents: ICellContents }> {\n return this.getCell(spec).onSuccess((cell) => {\n if (cell.immutable) {\n const contents: ICellContents = { value: cell.immutableValue, notes: [] };\n return succeed({ cell, contents });\n }\n return state.getCellContents(cell.id).onSuccess((contents: ICellContents) => {\n return succeed({ cell, contents });\n });\n });\n }\n\n public getCell(spec: string | IRowColumn | ICell): Result<Cell> {\n const want = Ids.cellId(spec);\n if (want.isFailure()) {\n return fail(want.message);\n }\n\n const cell = this._cells.get(want.value);\n return cell ? succeed(cell) : fail(`Cell ${want.value} not found`);\n }\n\n public getCellNeighbor(\n spec: string | IRowColumn | ICell,\n direction: NavigationDirection,\n wrap: NavigationWrap\n ): Result<ICell> {\n return this.getCell(spec).onSuccess((cell) => {\n const move =\n direction === 'left' || direction === 'right'\n ? this._moveColumn(cell, direction, wrap)\n : this._moveRow(cell, direction, wrap);\n return move.onSuccess((next) => this.getCell(next));\n });\n }\n\n public updateContents(wantUpdates: ICellState[] | ICellState, state: PuzzleState): Result<IPuzzleUpdate> {\n wantUpdates = Array.isArray(wantUpdates) ? wantUpdates : [wantUpdates];\n return mapResults(\n wantUpdates.map((u) =>\n this.getCellContents(u.id, state).onSuccess((existing) =>\n existing.cell.update(u.value, u.notes).onSuccess((to) => {\n const from: ICellState = { id: u.id, ...existing.contents };\n return succeed({ from, to });\n })\n )\n )\n ).onSuccess((cellUpdates) => {\n return state.update(cellUpdates.map(({ to }) => to)).onSuccess((updatedState: PuzzleState) => {\n return succeed({\n from: state,\n to: updatedState,\n cells: cellUpdates\n });\n });\n });\n }\n\n public updateValues(wantUpdates: ICellState[] | ICellState, state: PuzzleState): Result<IPuzzleUpdate> {\n wantUpdates = Array.isArray(wantUpdates) ? wantUpdates : [wantUpdates];\n return mapResults(\n wantUpdates.map((u) =>\n this.getCellContents(u.id, state).onSuccess((existing) =>\n existing.cell.update(u.value, existing.contents.notes).onSuccess((to) => {\n const from: ICellState = { id: u.id, ...existing.contents };\n return succeed({ from, to });\n })\n )\n )\n ).onSuccess((cellUpdates) => {\n return state.update(cellUpdates.map(({ to }) => to)).onSuccess((updatedState: PuzzleState) => {\n return succeed({\n from: state,\n to: updatedState,\n cells: cellUpdates\n });\n });\n });\n }\n\n public updateNotes(wantUpdates: ICellState[] | ICellState, state: PuzzleState): Result<IPuzzleUpdate> {\n wantUpdates = Array.isArray(wantUpdates) ? wantUpdates : [wantUpdates];\n return mapResults(\n wantUpdates.map((u) =>\n this.getCellContents(u.id, state).onSuccess((existing) =>\n existing.cell.update(existing.contents.value, u.notes).onSuccess((to) => {\n const from: ICellState = { id: u.id, ...existing.contents };\n return succeed({ from, to });\n })\n )\n )\n ).onSuccess((cellUpdates) => {\n return state.update(cellUpdates.map(({ to }) => to)).onSuccess((updatedState: PuzzleState) => {\n return succeed({\n from: state,\n to: updatedState,\n cells: cellUpdates\n });\n });\n });\n }\n\n public updateCellValue(\n want: string | IRowColumn,\n value: number | undefined,\n state: PuzzleState\n ): Result<IPuzzleUpdate> {\n const idResult = typeof want === 'string' ? Ids.cellId(want) : Ids.cellId(want);\n const notes: number[] = [];\n return idResult.onSuccess((id) => {\n const update: ICellState = { id, value, notes };\n return this.updateValues([update], state);\n });\n }\n\n public updateCellNotes(\n want: string | IRowColumn,\n notes: number[],\n state: PuzzleState\n ): Result<IPuzzleUpdate> {\n const idResult = typeof want === 'string' ? Ids.cellId(want) : Ids.cellId(want);\n const value = undefined;\n return idResult.onSuccess((id) => {\n const update: ICellState = { id, value, notes };\n return this.updateNotes([update], state);\n });\n }\n\n public getRow(row: CageId | number): Result<Cage> {\n const id = typeof row === 'number' ? Ids.rowCageId(row) : row;\n const cage = this._rows.get(id);\n return cage ? succeed(cage) : fail(`Row ${id} not found`);\n }\n\n public getColumn(col: CageId | number): Result<Cage> {\n const id = typeof col === 'number' ? Ids.columnCageId(col) : col;\n const cage = this._columns.get(id);\n return cage ? succeed(cage) : fail(`Column ${id} not found`);\n }\n\n public getSection(spec: CageId | IRowColumn): Result<Cage> {\n const id = typeof spec === 'object' ? Ids.sectionCageId(spec.row, spec.col) : spec;\n const cage = this._sections.get(id);\n return cage ? succeed(cage) : fail(`Section ${id} not found`);\n }\n\n public getCage(id: CageId): Result<Cage> {\n const cage = this._cages.get(id);\n return cage ? succeed(cage) : fail(`Cage ${id} not found`);\n }\n\n public toStrings(state: PuzzleState): string[] {\n return Array.from(this._rows.values()).map((row) => row.toString(state));\n }\n\n public toString(state: PuzzleState): string {\n return this.toStrings(state).join('\\n');\n }\n\n private _moveColumn(\n current: IRowColumn,\n direction: 'left' | 'right',\n wrap: NavigationWrap\n ): Result<IRowColumn> {\n const row = current.row;\n\n let col = current.col;\n if (direction === 'left') {\n if (col > 0) {\n col = col - 1;\n } else if (wrap !== 'none') {\n col = this.numColumns - 1;\n if (wrap === 'wrap-next') {\n return this._moveRow({ row, col }, 'up', 'wrap-around');\n }\n } else {\n return fail(`cannot move left from column ${current.col}`);\n }\n } else if (direction === 'right') {\n if (col < this.numColumns - 1) {\n col = col + 1;\n } else if (wrap !== 'none') {\n col = 0;\n if (wrap === 'wrap-next') {\n return this._moveRow({ row, col }, 'down', 'wrap-around');\n }\n } else {\n return fail(`cannot move right from column ${current.col}`);\n }\n }\n return succeed({ row, col });\n }\n\n private _moveRow(current: IRowColumn, direction: 'up' | 'down', wrap: NavigationWrap): Result<IRowColumn> {\n let row = current.row;\n const col = current.col;\n\n if (direction === 'up') {\n if (row > 0) {\n row = row - 1;\n } else if (wrap !== 'none') {\n row = this.numRows - 1;\n if (wrap === 'wrap-next') {\n return this._moveColumn({ row, col }, 'left', 'wrap-around');\n }\n } else {\n return fail(`cannot move up from row ${current.row}`);\n }\n } else if (direction === 'down') {\n if (row < this.numRows - 1) {\n row = row + 1;\n } else if (wrap !== 'none') {\n row = 0;\n if (wrap === 'wrap-next') {\n return this._moveColumn({ row, col }, 'right', 'wrap-around');\n }\n } else {\n return fail(`cannot move down from row ${current.row}`);\n }\n }\n return succeed({ row, col });\n }\n}\n"]}
|
|
1
|
+
{"version":3,"file":"puzzle.js","sourceRoot":"","sources":["../../../src/packlets/common/puzzle.ts"],"names":[],"mappings":"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","sourcesContent":["/*\n * MIT License\n *\n * Copyright (c) 2023 Erik Fortune\n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in all\n * copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\n * SOFTWARE.\n */\n\nimport { Result, fail, mapResults, succeed } from '@fgv/ts-utils';\nimport {\n CageId,\n CellId,\n ICellContents,\n ICellState,\n IRowColumn,\n NavigationDirection,\n NavigationWrap\n} from './common';\n\nimport { Cage } from './cage';\nimport { Cell } from './cell';\nimport { Ids } from './ids';\nimport { IPuzzleDescription } from './model';\nimport { ICell } from './public';\nimport { PuzzleState } from './puzzleState';\n\nconst basicCageTotal: number = 45;\n\n/**\n * @internal\n */\nexport interface ICellUpdate {\n from: ICellState;\n to: ICellState;\n}\n\n/**\n * @internal\n */\nexport interface IPuzzleUpdate {\n from: PuzzleState;\n to: PuzzleState;\n cells: ICellUpdate[];\n}\n\n/**\n * @internal\n */\nexport class Puzzle {\n public readonly id?: string;\n public readonly description: string;\n public readonly initialState: PuzzleState;\n\n /**\n * @internal\n */\n protected readonly _rows: Map<CageId, Cage>;\n\n /**\n * @internal\n */\n protected readonly _columns: Map<CageId, Cage>;\n\n /**\n * @internal\n */\n protected readonly _sections: Map<CageId, Cage>;\n\n /**\n * @internal\n */\n protected readonly _cages: Map<CageId, Cage>;\n\n /**\n * @internal\n */\n protected readonly _cells: Map<CellId, Cell>;\n\n /**\n * Constructs a new puzzle state.\n * @param puzzle - {@Link IPuzzleDescription | Puzzle description} from which this puzzle state\n * is to be initialized.\n */\n protected constructor(puzzle: IPuzzleDescription, extraCages?: [CageId, Cage][]) {\n /* c8 ignore next - ?? is defense in depth */\n extraCages = extraCages ?? [];\n\n if (puzzle.rows !== 9) {\n throw new Error(`Puzzle '${puzzle.description}' unsupported row count ${puzzle.rows}`);\n }\n if (puzzle.cols !== 9) {\n throw new Error(`Puzzle '${puzzle.description}' unsupported column count ${puzzle.cols}`);\n }\n if (puzzle.cells.length !== puzzle.rows * puzzle.cols) {\n throw new Error(\n `Puzzle '${puzzle.description}\" expected ${puzzle.rows * puzzle.cols} cells, found ${\n puzzle.cells.length\n }`\n );\n }\n\n this.id = puzzle.id;\n this.description = puzzle.description;\n\n const rows = Puzzle._createRowCages(puzzle.rows, puzzle.cols).orThrow();\n const columns = Puzzle._createColumnCages(puzzle.rows, puzzle.cols).orThrow();\n const sections = Puzzle._createSectionCages(puzzle.rows, puzzle.cols).orThrow();\n const cages = [...rows, ...columns, ...sections, ...extraCages];\n this._rows = new Map(rows);\n this._columns = new Map(columns);\n this._sections = new Map(sections);\n this._cages = new Map(cages);\n this._cells = new Map();\n\n const cellInit = [...puzzle.cells];\n for (let row = 0; row < this._rows.size; row++) {\n const rowCage = this.getRow(row).orThrow();\n for (let col = 0; col < this._columns.size; col++) {\n const id = Ids.cellId({ row, col }).orThrow();\n const colCage = this.getColumn(col).orThrow();\n const sectionCage = this.getSection({ row, col }).orThrow();\n const otherCages = extraCages.filter(([__key, cage]) => cage.containsCell(id));\n\n const init = cellInit.shift();\n /* c8 ignore next - defense in depth/make type check happy. undefined init should never happen */\n const immutableValue = init === '.' ? undefined : Number.parseInt(init ?? '0');\n if (\n immutableValue !== undefined &&\n (Number.isNaN(immutableValue) || immutableValue < 1 || immutableValue > 9)\n ) {\n throw new Error(`Puzzle ${puzzle.description} illegal value \"${init}\" for cell ${id}`);\n }\n const cages = [rowCage, colCage, sectionCage, ...otherCages.map(([__key, state]) => state)];\n const cell = new Cell({ id, immutableValue, row, col }, cages);\n this._cells.set(id, cell);\n }\n }\n\n this.initialState = PuzzleState.create(\n Array.from(this._cells.entries()).map(([id, state]): ICellState => {\n return { id, value: state.immutableValue, notes: [] };\n })\n ).orThrow();\n }\n\n public get numRows(): number {\n return this._rows.size;\n }\n\n public get numColumns(): number {\n return this._columns.size;\n }\n\n public get rows(): Cage[] {\n return Array.from(this._rows.values());\n }\n\n public get cols(): Cage[] {\n return Array.from(this._columns.values());\n }\n\n public get sections(): Cage[] {\n return Array.from(this._sections.values());\n }\n\n public get cages(): Cage[] {\n return Array.from(this._cages.values());\n }\n\n public get cells(): Cell[] {\n return Array.from(this._cells.values());\n }\n\n /**\n * @internal\n */\n protected static _createRowCages(numRows: number, numCols: number): Result<[CageId, Cage][]> {\n const cages: [CageId, Cage][] = [];\n for (let r = 0; r < numRows; r++) {\n const id = Ids.rowCageId(r);\n const cellIds = Ids.cellIds(r, 1, 0, numCols);\n /* c8 ignore next 3 - defense in depth should never happen */\n if (cellIds.isFailure()) {\n return fail(cellIds.message);\n }\n\n const result = Cage.create(id, 'row', basicCageTotal, cellIds.value).onSuccess((cage) => {\n cages.push([id, cage]);\n return succeed(cage);\n });\n /* c8 ignore next 3 - defense in depth should never happen */\n if (result.isFailure()) {\n return fail(result.message);\n }\n }\n return succeed(cages);\n }\n\n /**\n * @internal\n */\n protected static _createColumnCages(numRows: number, numCols: number): Result<[CageId, Cage][]> {\n const cages: [CageId, Cage][] = [];\n for (let c = 0; c < numCols; c++) {\n const id = Ids.columnCageId(c);\n const cellIds = Ids.cellIds(0, numRows, c, 1);\n /* c8 ignore next 3 - defense in depth should never happen */\n if (cellIds.isFailure()) {\n return fail(cellIds.message);\n }\n\n const result = Cage.create(id, 'column', basicCageTotal, cellIds.value).onSuccess((cage) => {\n cages.push([id, cage]);\n return succeed(cage);\n });\n /* c8 ignore next 3 - defense in depth should never happen */\n if (result.isFailure()) {\n return fail(result.message);\n }\n }\n return succeed(cages);\n }\n\n /**\n * @internal\n */\n private static _createSectionCages(numRows: number, numCols: number): Result<[CageId, Cage][]> {\n const cages: [CageId, Cage][] = [];\n for (let r = 0; r < numRows; r += 3) {\n for (let c = 0; c < numCols; c += 3) {\n const id = Ids.sectionCageId(r, c);\n const cellIds = Ids.cellIds(r, 3, c, 3);\n /* c8 ignore next 3 - defense in depth should never happen */\n if (cellIds.isFailure()) {\n return fail(cellIds.message);\n }\n\n const result = Cage.create(id, 'section', basicCageTotal, cellIds.value).onSuccess((cage) => {\n cages.push([id, cage]);\n return succeed(cage);\n });\n /* c8 ignore next 3 - defense in depth should never happen */\n if (result.isFailure()) {\n return fail(result.message);\n }\n }\n }\n return succeed(cages);\n }\n\n public checkIsSolved(state: PuzzleState): boolean {\n for (const id of this._cells.keys()) {\n if (!state.hasValue(id)) {\n return false;\n }\n }\n for (const cell of this._cells.values()) {\n if (!cell.isValid(state)) {\n return false;\n }\n }\n return true;\n }\n\n public checkIsValid(state: PuzzleState): boolean {\n for (const cell of this._cells.values()) {\n if (!cell.isValid(state)) {\n return false;\n }\n }\n return true;\n }\n\n public getEmptyCells(state: PuzzleState): Cell[] {\n return Array.from(this._cells.values()).filter((c) => !state.hasValue(c.id));\n }\n\n public getInvalidCells(state: PuzzleState): Cell[] {\n return Array.from(this._cells.values()).filter((c) => !c.isValid(state));\n }\n\n public getCellContents(\n spec: string | IRowColumn,\n state: PuzzleState\n ): Result<{ cell: Cell; contents: ICellContents }> {\n return this.getCell(spec).onSuccess((cell) => {\n if (cell.immutable) {\n const contents: ICellContents = { value: cell.immutableValue, notes: [] };\n return succeed({ cell, contents });\n }\n return state.getCellContents(cell.id).onSuccess((contents: ICellContents) => {\n return succeed({ cell, contents });\n });\n });\n }\n\n public getCell(spec: string | IRowColumn | ICell): Result<Cell> {\n const want = Ids.cellId(spec);\n if (want.isFailure()) {\n return fail(want.message);\n }\n\n const cell = this._cells.get(want.value);\n return cell ? succeed(cell) : fail(`Cell ${want.value} not found`);\n }\n\n public getCellNeighbor(\n spec: string | IRowColumn | ICell,\n direction: NavigationDirection,\n wrap: NavigationWrap\n ): Result<ICell> {\n return this.getCell(spec).onSuccess((cell) => {\n const move =\n direction === 'left' || direction === 'right'\n ? this._moveColumn(cell, direction, wrap)\n : this._moveRow(cell, direction, wrap);\n return move.onSuccess((next) => this.getCell(next));\n });\n }\n\n public updateContents(wantUpdates: ICellState[] | ICellState, state: PuzzleState): Result<IPuzzleUpdate> {\n wantUpdates = Array.isArray(wantUpdates) ? wantUpdates : [wantUpdates];\n return mapResults(\n wantUpdates.map((u) =>\n this.getCellContents(u.id, state).onSuccess((existing) =>\n existing.cell.update(u.value, u.notes).onSuccess((to) => {\n const from: ICellState = { id: u.id, ...existing.contents };\n return succeed({ from, to });\n })\n )\n )\n ).onSuccess((cellUpdates) => {\n return state.update(cellUpdates.map(({ to }) => to)).onSuccess((updatedState: PuzzleState) => {\n return succeed({\n from: state,\n to: updatedState,\n cells: cellUpdates\n });\n });\n });\n }\n\n public updateValues(wantUpdates: ICellState[] | ICellState, state: PuzzleState): Result<IPuzzleUpdate> {\n wantUpdates = Array.isArray(wantUpdates) ? wantUpdates : [wantUpdates];\n return mapResults(\n wantUpdates.map((u) =>\n this.getCellContents(u.id, state).onSuccess((existing) =>\n existing.cell.update(u.value, existing.contents.notes).onSuccess((to) => {\n const from: ICellState = { id: u.id, ...existing.contents };\n return succeed({ from, to });\n })\n )\n )\n ).onSuccess((cellUpdates) => {\n return state.update(cellUpdates.map(({ to }) => to)).onSuccess((updatedState: PuzzleState) => {\n return succeed({\n from: state,\n to: updatedState,\n cells: cellUpdates\n });\n });\n });\n }\n\n public updateNotes(wantUpdates: ICellState[] | ICellState, state: PuzzleState): Result<IPuzzleUpdate> {\n wantUpdates = Array.isArray(wantUpdates) ? wantUpdates : [wantUpdates];\n return mapResults(\n wantUpdates.map((u) =>\n this.getCellContents(u.id, state).onSuccess((existing) =>\n existing.cell.update(existing.contents.value, u.notes).onSuccess((to) => {\n const from: ICellState = { id: u.id, ...existing.contents };\n return succeed({ from, to });\n })\n )\n )\n ).onSuccess((cellUpdates) => {\n return state.update(cellUpdates.map(({ to }) => to)).onSuccess((updatedState: PuzzleState) => {\n return succeed({\n from: state,\n to: updatedState,\n cells: cellUpdates\n });\n });\n });\n }\n\n public updateCellValue(\n want: string | IRowColumn,\n value: number | undefined,\n state: PuzzleState\n ): Result<IPuzzleUpdate> {\n const idResult = typeof want === 'string' ? Ids.cellId(want) : Ids.cellId(want);\n const notes: number[] = [];\n return idResult.onSuccess((id) => {\n const update: ICellState = { id, value, notes };\n return this.updateValues([update], state);\n });\n }\n\n public updateCellNotes(\n want: string | IRowColumn,\n notes: number[],\n state: PuzzleState\n ): Result<IPuzzleUpdate> {\n const idResult = typeof want === 'string' ? Ids.cellId(want) : Ids.cellId(want);\n const value = undefined;\n return idResult.onSuccess((id) => {\n const update: ICellState = { id, value, notes };\n return this.updateNotes([update], state);\n });\n }\n\n public getRow(row: CageId | number): Result<Cage> {\n const id = typeof row === 'number' ? Ids.rowCageId(row) : row;\n const cage = this._rows.get(id);\n return cage ? succeed(cage) : fail(`Row ${id} not found`);\n }\n\n public getColumn(col: CageId | number): Result<Cage> {\n const id = typeof col === 'number' ? Ids.columnCageId(col) : col;\n const cage = this._columns.get(id);\n return cage ? succeed(cage) : fail(`Column ${id} not found`);\n }\n\n public getSection(spec: CageId | IRowColumn): Result<Cage> {\n const id = typeof spec === 'object' ? Ids.sectionCageId(spec.row, spec.col) : spec;\n const cage = this._sections.get(id);\n return cage ? succeed(cage) : fail(`Section ${id} not found`);\n }\n\n public getCage(id: CageId): Result<Cage> {\n const cage = this._cages.get(id);\n return cage ? succeed(cage) : fail(`Cage ${id} not found`);\n }\n\n public toStrings(state: PuzzleState): string[] {\n return Array.from(this._rows.values()).map((row) => row.toString(state));\n }\n\n public toString(state: PuzzleState): string {\n return this.toStrings(state).join('\\n');\n }\n\n private _moveColumn(\n current: IRowColumn,\n direction: 'left' | 'right',\n wrap: NavigationWrap\n ): Result<IRowColumn> {\n const row = current.row;\n\n let col = current.col;\n if (direction === 'left') {\n if (col > 0) {\n col = col - 1;\n } else if (wrap !== 'none') {\n col = this.numColumns - 1;\n if (wrap === 'wrap-next') {\n return this._moveRow({ row, col }, 'up', 'wrap-around');\n }\n } else {\n return fail(`cannot move left from column ${current.col}`);\n }\n } else if (direction === 'right') {\n if (col < this.numColumns - 1) {\n col = col + 1;\n } else if (wrap !== 'none') {\n col = 0;\n if (wrap === 'wrap-next') {\n return this._moveRow({ row, col }, 'down', 'wrap-around');\n }\n } else {\n return fail(`cannot move right from column ${current.col}`);\n }\n }\n return succeed({ row, col });\n }\n\n private _moveRow(current: IRowColumn, direction: 'up' | 'down', wrap: NavigationWrap): Result<IRowColumn> {\n let row = current.row;\n const col = current.col;\n\n if (direction === 'up') {\n if (row > 0) {\n row = row - 1;\n } else if (wrap !== 'none') {\n row = this.numRows - 1;\n if (wrap === 'wrap-next') {\n return this._moveColumn({ row, col }, 'left', 'wrap-around');\n }\n } else {\n return fail(`cannot move up from row ${current.row}`);\n }\n } else if (direction === 'down') {\n if (row < this.numRows - 1) {\n row = row + 1;\n } else if (wrap !== 'none') {\n row = 0;\n if (wrap === 'wrap-next') {\n return this._moveColumn({ row, col }, 'right', 'wrap-around');\n }\n } else {\n return fail(`cannot move down from row ${current.row}`);\n }\n }\n return succeed({ row, col });\n }\n}\n"]}
|
|
@@ -1,13 +1,13 @@
|
|
|
1
1
|
import { Converter, Result } from '@fgv/ts-utils';
|
|
2
2
|
import { IPuzzlesFile } from './model';
|
|
3
3
|
/**
|
|
4
|
-
* Converts an arbitrary object to a {@link
|
|
4
|
+
* Converts an arbitrary object to a {@link File.Model.IPuzzlesFile | IPuzzlesFile}.
|
|
5
5
|
* @public
|
|
6
6
|
*/
|
|
7
7
|
export declare const puzzlesFile: Converter<IPuzzlesFile>;
|
|
8
8
|
/**
|
|
9
9
|
* Loads an arbitrary JSON file and parses it to return a validated
|
|
10
|
-
* {@link
|
|
10
|
+
* {@link File.Model.IPuzzlesFile | IPuzzlesFile}.
|
|
11
11
|
* @param path - String path to the file
|
|
12
12
|
* @returns `Success` with the resulting file, or `Failure` with details if an
|
|
13
13
|
* error occurs.
|
|
@@ -28,7 +28,7 @@ const ts_utils_1 = require("@fgv/ts-utils");
|
|
|
28
28
|
const ts_json_base_1 = require("@fgv/ts-json-base");
|
|
29
29
|
const common_1 = require("../common");
|
|
30
30
|
/**
|
|
31
|
-
* Converts an arbitrary object to a {@link
|
|
31
|
+
* Converts an arbitrary object to a {@link File.Model.IPuzzlesFile | IPuzzlesFile}.
|
|
32
32
|
* @public
|
|
33
33
|
*/
|
|
34
34
|
exports.puzzlesFile = ts_utils_1.Converters.strictObject({
|
|
@@ -36,7 +36,7 @@ exports.puzzlesFile = ts_utils_1.Converters.strictObject({
|
|
|
36
36
|
});
|
|
37
37
|
/**
|
|
38
38
|
* Loads an arbitrary JSON file and parses it to return a validated
|
|
39
|
-
* {@link
|
|
39
|
+
* {@link File.Model.IPuzzlesFile | IPuzzlesFile}.
|
|
40
40
|
* @param path - String path to the file
|
|
41
41
|
* @returns `Success` with the resulting file, or `Failure` with details if an
|
|
42
42
|
* error occurs.
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"converters.js","sourceRoot":"","sources":["../../../src/packlets/file/converters.ts"],"names":[],"mappings":";AAAA;;;;;;;;;;;;;;;;;;;;;;GAsBG;;;AAEH,4CAA8D;AAG9D,oDAA6C;AAC7C,sCAA2D;AAE3D;;;GAGG;AACU,QAAA,WAAW,GAA4B,qBAAU,CAAC,YAAY,CAAe;IACxF,OAAO,EAAE,qBAAU,CAAC,OAAO,CAAC,mBAAgB,CAAC,iBAAiB,CAAC;CAChE,CAAC,CAAC;AAEH;;;;;;;GAOG;AACH,SAAgB,uBAAuB,CAAC,IAAY;IAClD,OAAO,uBAAQ,CAAC,mBAAmB,CAAC,IAAI,EAAE,mBAAW,CAAC,CAAC;AACzD,CAAC;AAFD,0DAEC","sourcesContent":["/*\n * MIT License\n *\n * Copyright (c) 2023 Erik Fortune\n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in all\n * copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\n * SOFTWARE.\n */\n\nimport { Converter, Converters, Result } from '@fgv/ts-utils';\nimport { IPuzzlesFile } from './model';\n\nimport { JsonFile } from '@fgv/ts-json-base';\nimport { Converters as CommonConverters } from '../common';\n\n/**\n * Converts an arbitrary object to a {@link
|
|
1
|
+
{"version":3,"file":"converters.js","sourceRoot":"","sources":["../../../src/packlets/file/converters.ts"],"names":[],"mappings":";AAAA;;;;;;;;;;;;;;;;;;;;;;GAsBG;;;AAEH,4CAA8D;AAG9D,oDAA6C;AAC7C,sCAA2D;AAE3D;;;GAGG;AACU,QAAA,WAAW,GAA4B,qBAAU,CAAC,YAAY,CAAe;IACxF,OAAO,EAAE,qBAAU,CAAC,OAAO,CAAC,mBAAgB,CAAC,iBAAiB,CAAC;CAChE,CAAC,CAAC;AAEH;;;;;;;GAOG;AACH,SAAgB,uBAAuB,CAAC,IAAY;IAClD,OAAO,uBAAQ,CAAC,mBAAmB,CAAC,IAAI,EAAE,mBAAW,CAAC,CAAC;AACzD,CAAC;AAFD,0DAEC","sourcesContent":["/*\n * MIT License\n *\n * Copyright (c) 2023 Erik Fortune\n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in all\n * copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\n * SOFTWARE.\n */\n\nimport { Converter, Converters, Result } from '@fgv/ts-utils';\nimport { IPuzzlesFile } from './model';\n\nimport { JsonFile } from '@fgv/ts-json-base';\nimport { Converters as CommonConverters } from '../common';\n\n/**\n * Converts an arbitrary object to a {@link File.Model.IPuzzlesFile | IPuzzlesFile}.\n * @public\n */\nexport const puzzlesFile: Converter<IPuzzlesFile> = Converters.strictObject<IPuzzlesFile>({\n puzzles: Converters.arrayOf(CommonConverters.puzzleDescription)\n});\n\n/**\n * Loads an arbitrary JSON file and parses it to return a validated\n * {@link File.Model.IPuzzlesFile | IPuzzlesFile}.\n * @param path - String path to the file\n * @returns `Success` with the resulting file, or `Failure` with details if an\n * error occurs.\n * @public\n */\nexport function loadJsonPuzzlesFileSync(path: string): Result<IPuzzlesFile> {\n return JsonFile.convertJsonFileSync(path, puzzlesFile);\n}\n"]}
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import { Result } from '@fgv/ts-utils';
|
|
2
2
|
import { IPuzzleDescription, Puzzle } from '../common';
|
|
3
3
|
/**
|
|
4
|
-
* Static class to instantiate any puzzle from a {@link
|
|
4
|
+
* Static class to instantiate any puzzle from a {@link PuzzleDescription | puzzle description}.
|
|
5
5
|
* @internal
|
|
6
6
|
*/
|
|
7
7
|
export declare class AnyPuzzle {
|
|
@@ -29,7 +29,7 @@ const killerSudokuPuzzle_1 = require("./killerSudokuPuzzle");
|
|
|
29
29
|
const sudokuPuzzle_1 = require("./sudokuPuzzle");
|
|
30
30
|
const sudokuXPuzzle_1 = require("./sudokuXPuzzle");
|
|
31
31
|
/**
|
|
32
|
-
* Static class to instantiate any puzzle from a {@link
|
|
32
|
+
* Static class to instantiate any puzzle from a {@link PuzzleDescription | puzzle description}.
|
|
33
33
|
* @internal
|
|
34
34
|
*/
|
|
35
35
|
class AnyPuzzle {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"anyPuzzle.js","sourceRoot":"","sources":["../../../src/packlets/puzzles/anyPuzzle.ts"],"names":[],"mappings":";AAAA;;;;;;;;;;;;;;;;;;;;;;GAsBG;;;AAEH,4CAA6C;AAG7C,6DAA0D;AAC1D,iDAA8C;AAC9C,mDAAgD;AAEhD;;;GAGG;AACH,MAAa,SAAS;IACb,MAAM,CAAC,MAAM,CAAC,MAA0B;QAC7C,QAAQ,MAAM,CAAC,IAAI,EAAE,CAAC;YACpB,KAAK,QAAQ;gBACX,OAAO,2BAAY,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC;YACrC,KAAK,UAAU;gBACb,OAAO,6BAAa,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC;YACtC,KAAK,eAAe;gBAClB,OAAO,uCAAkB,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC;YAC3C,sBAAsB;YACtB;gBACE,OAAO,IAAA,eAAI,EAAC,WAAW,MAAM,CAAC,WAAW,sBAAsB,MAAM,CAAC,IAAI,EAAE,CAAC,CAAC;QAClF,CAAC;IACH,CAAC;CACF;AAdD,8BAcC","sourcesContent":["/*\n * MIT License\n *\n * Copyright (c) 2023 Erik Fortune\n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in all\n * copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\n * SOFTWARE.\n */\n\nimport { Result, fail } from '@fgv/ts-utils';\n\nimport { IPuzzleDescription, Puzzle } from '../common';\nimport { KillerSudokuPuzzle } from './killerSudokuPuzzle';\nimport { SudokuPuzzle } from './sudokuPuzzle';\nimport { SudokuXPuzzle } from './sudokuXPuzzle';\n\n/**\n * Static class to instantiate any puzzle from a {@link
|
|
1
|
+
{"version":3,"file":"anyPuzzle.js","sourceRoot":"","sources":["../../../src/packlets/puzzles/anyPuzzle.ts"],"names":[],"mappings":";AAAA;;;;;;;;;;;;;;;;;;;;;;GAsBG;;;AAEH,4CAA6C;AAG7C,6DAA0D;AAC1D,iDAA8C;AAC9C,mDAAgD;AAEhD;;;GAGG;AACH,MAAa,SAAS;IACb,MAAM,CAAC,MAAM,CAAC,MAA0B;QAC7C,QAAQ,MAAM,CAAC,IAAI,EAAE,CAAC;YACpB,KAAK,QAAQ;gBACX,OAAO,2BAAY,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC;YACrC,KAAK,UAAU;gBACb,OAAO,6BAAa,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC;YACtC,KAAK,eAAe;gBAClB,OAAO,uCAAkB,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC;YAC3C,sBAAsB;YACtB;gBACE,OAAO,IAAA,eAAI,EAAC,WAAW,MAAM,CAAC,WAAW,sBAAsB,MAAM,CAAC,IAAI,EAAE,CAAC,CAAC;QAClF,CAAC;IACH,CAAC;CACF;AAdD,8BAcC","sourcesContent":["/*\n * MIT License\n *\n * Copyright (c) 2023 Erik Fortune\n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in all\n * copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\n * SOFTWARE.\n */\n\nimport { Result, fail } from '@fgv/ts-utils';\n\nimport { IPuzzleDescription, Puzzle } from '../common';\nimport { KillerSudokuPuzzle } from './killerSudokuPuzzle';\nimport { SudokuPuzzle } from './sudokuPuzzle';\nimport { SudokuXPuzzle } from './sudokuXPuzzle';\n\n/**\n * Static class to instantiate any puzzle from a {@link PuzzleDescription | puzzle description}.\n * @internal\n */\nexport class AnyPuzzle {\n public static create(puzzle: IPuzzleDescription): Result<Puzzle> {\n switch (puzzle.type) {\n case 'sudoku':\n return SudokuPuzzle.create(puzzle);\n case 'sudoku-x':\n return SudokuXPuzzle.create(puzzle);\n case 'killer-sudoku':\n return KillerSudokuPuzzle.create(puzzle);\n /* c8 ignore next 2 */\n default:\n return fail(`Puzzle '${puzzle.description}' unsupported type ${puzzle.type}`);\n }\n }\n}\n"]}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@fgv/ts-sudoku-lib",
|
|
3
|
-
"version": "
|
|
3
|
+
"version": "4.0.1",
|
|
4
4
|
"description": "Sudoku rules library",
|
|
5
5
|
"main": "lib/index.js",
|
|
6
6
|
"types": "dist/ts-json.d.ts",
|
|
@@ -16,14 +16,14 @@
|
|
|
16
16
|
"homepage": "https://github.com/ErikFortune/fgv/libraries/ts-sudoku-lib#readme",
|
|
17
17
|
"sideEffects": false,
|
|
18
18
|
"devDependencies": {
|
|
19
|
-
"@fgv/ts-utils": "
|
|
20
|
-
"@fgv/ts-utils-jest": "
|
|
21
|
-
"@microsoft/api-documenter": "^7.
|
|
22
|
-
"@microsoft/api-extractor": "^7.
|
|
19
|
+
"@fgv/ts-utils": "4.0.1",
|
|
20
|
+
"@fgv/ts-utils-jest": "4.0.1",
|
|
21
|
+
"@microsoft/api-documenter": "^7.24.5",
|
|
22
|
+
"@microsoft/api-extractor": "^7.43.4",
|
|
23
23
|
"@types/jest": "^29.5.12",
|
|
24
|
-
"@types/node": "^20.11
|
|
25
|
-
"@typescript-eslint/eslint-plugin": "^7.
|
|
26
|
-
"@typescript-eslint/parser": "^7.
|
|
24
|
+
"@types/node": "^20.12.11",
|
|
25
|
+
"@typescript-eslint/eslint-plugin": "^7.9.0",
|
|
26
|
+
"@typescript-eslint/parser": "^7.9.0",
|
|
27
27
|
"cspell": "^8.3.2",
|
|
28
28
|
"eslint": "^8.57.0",
|
|
29
29
|
"eslint-config-prettier": "^9.1.0",
|
|
@@ -35,21 +35,21 @@
|
|
|
35
35
|
"eslint-plugin-promise": "^6.1.1",
|
|
36
36
|
"jest": "^29.7.0",
|
|
37
37
|
"prettier": "^3.2.5",
|
|
38
|
-
"rimraf": "^5.0.
|
|
38
|
+
"rimraf": "^5.0.7",
|
|
39
39
|
"ts-jest": "^29.1.2",
|
|
40
40
|
"ts-node": "^10.9.2",
|
|
41
|
-
"typescript": "^5.
|
|
41
|
+
"typescript": "^5.4.5",
|
|
42
42
|
"eslint-plugin-n": "^16.6.2",
|
|
43
|
-
"@rushstack/heft": "~0.
|
|
44
|
-
"@rushstack/heft-node-rig": "~2.
|
|
43
|
+
"@rushstack/heft": "~0.66.6",
|
|
44
|
+
"@rushstack/heft-node-rig": "~2.6.3",
|
|
45
45
|
"@types/heft-jest": "1.0.6",
|
|
46
|
-
"@rushstack/eslint-config": "~3.6.
|
|
47
|
-
"@rushstack/heft-jest-plugin": "~0.11.
|
|
46
|
+
"@rushstack/eslint-config": "~3.6.9",
|
|
47
|
+
"@rushstack/heft-jest-plugin": "~0.11.27",
|
|
48
48
|
"eslint-plugin-tsdoc": "~0.2.17",
|
|
49
|
-
"@fgv/ts-json-base": "
|
|
49
|
+
"@fgv/ts-json-base": "4.0.1"
|
|
50
50
|
},
|
|
51
51
|
"peerDependencies": {
|
|
52
|
-
"@fgv/ts-utils": "
|
|
52
|
+
"@fgv/ts-utils": "4.0.1"
|
|
53
53
|
},
|
|
54
54
|
"scripts": {
|
|
55
55
|
"build": "heft test --clean",
|