@fgv/ts-sudoku-lib 4.5.0-3 → 4.5.0

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 CHANGED
@@ -1,6 +1,21 @@
1
1
  {
2
2
  "name": "@fgv/ts-sudoku-lib",
3
3
  "entries": [
4
+ {
5
+ "version": "4.5.0",
6
+ "tag": "@fgv/ts-sudoku-lib_v4.5.0",
7
+ "date": "Tue, 01 Jul 2025 03:26:11 GMT",
8
+ "comments": {
9
+ "patch": [
10
+ {
11
+ "comment": "Fix redundant conditional logic in updateCellValue and updateCellNotes methods that called identical functions in both branches of ternary operator"
12
+ },
13
+ {
14
+ "comment": "Fix incorrect TypeScript declaration file reference and build script in package.json"
15
+ }
16
+ ]
17
+ }
18
+ },
4
19
  {
5
20
  "version": "4.4.0",
6
21
  "tag": "@fgv/ts-sudoku-lib_v4.4.0",
package/CHANGELOG.md CHANGED
@@ -1,6 +1,14 @@
1
1
  # Change Log - @fgv/ts-sudoku-lib
2
2
 
3
- This log was last generated on Sat, 01 Feb 2025 17:13:10 GMT and should not be manually modified.
3
+ This log was last generated on Tue, 01 Jul 2025 03:26:11 GMT and should not be manually modified.
4
+
5
+ ## 4.5.0
6
+ Tue, 01 Jul 2025 03:26:11 GMT
7
+
8
+ ### Patches
9
+
10
+ - Fix redundant conditional logic in updateCellValue and updateCellNotes methods that called identical functions in both branches of ternary operator
11
+ - Fix incorrect TypeScript declaration file reference and build script in package.json
4
12
 
5
13
  ## 4.4.0
6
14
  Sat, 01 Feb 2025 17:13:10 GMT
@@ -5,7 +5,7 @@
5
5
  "toolPackages": [
6
6
  {
7
7
  "packageName": "@microsoft/api-extractor",
8
- "packageVersion": "7.52.1"
8
+ "packageVersion": "7.49.1"
9
9
  }
10
10
  ]
11
11
  }
@@ -278,7 +278,7 @@ class Puzzle {
278
278
  });
279
279
  }
280
280
  updateCellValue(want, value, state) {
281
- const idResult = typeof want === 'string' ? ids_1.Ids.cellId(want) : ids_1.Ids.cellId(want);
281
+ const idResult = ids_1.Ids.cellId(want);
282
282
  const notes = [];
283
283
  return idResult.onSuccess((id) => {
284
284
  const update = { id, value, notes };
@@ -286,7 +286,7 @@ class Puzzle {
286
286
  });
287
287
  }
288
288
  updateCellNotes(want, notes, state) {
289
- const idResult = typeof want === 'string' ? ids_1.Ids.cellId(want) : ids_1.Ids.cellId(want);
289
+ const idResult = ids_1.Ids.cellId(want);
290
290
  const value = undefined;
291
291
  return idResult.onSuccess((id) => {
292
292
  const update = { id, value, notes };
@@ -1 +1 @@
1
- {"version":3,"file":"puzzle.js","sourceRoot":"","sources":["../../../src/packlets/common/puzzle.ts"],"names":[],"mappings":";AAAA;;;;;;;;;;;;;;;;;;;;;;GAsBG;;;AAEH,4CAAkE;AAWlE,iCAA8B;AAC9B,iCAA8B;AAC9B,+BAA4B;AAG5B,+CAA4C;AAE5C,MAAM,cAAc,GAAW,EAAE,CAAC;AAmBlC;;GAEG;AACH,MAAa,MAAM;IA8BjB;;;;OAIG;IACH,YAAsB,MAA0B,EAAE,UAA6B;QAC7E,6CAA6C;QAC7C,UAAU,GAAG,UAAU,aAAV,UAAU,cAAV,UAAU,GAAI,EAAE,CAAC;QAE9B,IAAI,MAAM,CAAC,IAAI,KAAK,CAAC,EAAE,CAAC;YACtB,MAAM,IAAI,KAAK,CAAC,WAAW,MAAM,CAAC,WAAW,2BAA2B,MAAM,CAAC,IAAI,EAAE,CAAC,CAAC;QACzF,CAAC;QACD,IAAI,MAAM,CAAC,IAAI,KAAK,CAAC,EAAE,CAAC;YACtB,MAAM,IAAI,KAAK,CAAC,WAAW,MAAM,CAAC,WAAW,8BAA8B,MAAM,CAAC,IAAI,EAAE,CAAC,CAAC;QAC5F,CAAC;QACD,IAAI,MAAM,CAAC,KAAK,CAAC,MAAM,KAAK,MAAM,CAAC,IAAI,GAAG,MAAM,CAAC,IAAI,EAAE,CAAC;YACtD,MAAM,IAAI,KAAK,CACb,WAAW,MAAM,CAAC,WAAW,cAAc,MAAM,CAAC,IAAI,GAAG,MAAM,CAAC,IAAI,iBAClE,MAAM,CAAC,KAAK,CAAC,MACf,EAAE,CACH,CAAC;QACJ,CAAC;QAED,IAAI,CAAC,EAAE,GAAG,MAAM,CAAC,EAAE,CAAC;QACpB,IAAI,CAAC,WAAW,GAAG,MAAM,CAAC,WAAW,CAAC;QAEtC,MAAM,IAAI,GAAG,MAAM,CAAC,eAAe,CAAC,MAAM,CAAC,IAAI,EAAE,MAAM,CAAC,IAAI,CAAC,CAAC,OAAO,EAAE,CAAC;QACxE,MAAM,OAAO,GAAG,MAAM,CAAC,kBAAkB,CAAC,MAAM,CAAC,IAAI,EAAE,MAAM,CAAC,IAAI,CAAC,CAAC,OAAO,EAAE,CAAC;QAC9E,MAAM,QAAQ,GAAG,MAAM,CAAC,mBAAmB,CAAC,MAAM,CAAC,IAAI,EAAE,MAAM,CAAC,IAAI,CAAC,CAAC,OAAO,EAAE,CAAC;QAChF,MAAM,KAAK,GAAG,CAAC,GAAG,IAAI,EAAE,GAAG,OAAO,EAAE,GAAG,QAAQ,EAAE,GAAG,UAAU,CAAC,CAAC;QAChE,IAAI,CAAC,KAAK,GAAG,IAAI,GAAG,CAAC,IAAI,CAAC,CAAC;QAC3B,IAAI,CAAC,QAAQ,GAAG,IAAI,GAAG,CAAC,OAAO,CAAC,CAAC;QACjC,IAAI,CAAC,SAAS,GAAG,IAAI,GAAG,CAAC,QAAQ,CAAC,CAAC;QACnC,IAAI,CAAC,MAAM,GAAG,IAAI,GAAG,CAAC,KAAK,CAAC,CAAC;QAC7B,IAAI,CAAC,MAAM,GAAG,IAAI,GAAG,EAAE,CAAC;QAExB,MAAM,QAAQ,GAAG,CAAC,GAAG,MAAM,CAAC,KAAK,CAAC,CAAC;QACnC,KAAK,IAAI,GAAG,GAAG,CAAC,EAAE,GAAG,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,EAAE,GAAG,EAAE,EAAE,CAAC;YAC/C,MAAM,OAAO,GAAG,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,OAAO,EAAE,CAAC;YAC3C,KAAK,IAAI,GAAG,GAAG,CAAC,EAAE,GAAG,GAAG,IAAI,CAAC,QAAQ,CAAC,IAAI,EAAE,GAAG,EAAE,EAAE,CAAC;gBAClD,MAAM,EAAE,GAAG,SAAG,CAAC,MAAM,CAAC,EAAE,GAAG,EAAE,GAAG,EAAE,CAAC,CAAC,OAAO,EAAE,CAAC;gBAC9C,MAAM,OAAO,GAAG,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,CAAC,OAAO,EAAE,CAAC;gBAC9C,MAAM,WAAW,GAAG,IAAI,CAAC,UAAU,CAAC,EAAE,GAAG,EAAE,GAAG,EAAE,CAAC,CAAC,OAAO,EAAE,CAAC;gBAC5D,MAAM,UAAU,GAAG,UAAU,CAAC,MAAM,CAAC,CAAC,CAAC,KAAK,EAAE,IAAI,CAAC,EAAE,EAAE,CAAC,IAAI,CAAC,YAAY,CAAC,EAAE,CAAC,CAAC,CAAC;gBAE/E,MAAM,IAAI,GAAG,QAAQ,CAAC,KAAK,EAAE,CAAC;gBAC9B,iGAAiG;gBACjG,MAAM,cAAc,GAAG,IAAI,KAAK,GAAG,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,MAAM,CAAC,QAAQ,CAAC,IAAI,aAAJ,IAAI,cAAJ,IAAI,GAAI,GAAG,CAAC,CAAC;gBAC/E,IACE,cAAc,KAAK,SAAS;oBAC5B,CAAC,MAAM,CAAC,KAAK,CAAC,cAAc,CAAC,IAAI,cAAc,GAAG,CAAC,IAAI,cAAc,GAAG,CAAC,CAAC,EAC1E,CAAC;oBACD,MAAM,IAAI,KAAK,CAAC,UAAU,MAAM,CAAC,WAAW,mBAAmB,IAAI,cAAc,EAAE,EAAE,CAAC,CAAC;gBACzF,CAAC;gBACD,MAAM,KAAK,GAAG,CAAC,OAAO,EAAE,OAAO,EAAE,WAAW,EAAE,GAAG,UAAU,CAAC,GAAG,CAAC,CAAC,CAAC,KAAK,EAAE,KAAK,CAAC,EAAE,EAAE,CAAC,KAAK,CAAC,CAAC,CAAC;gBAC5F,MAAM,IAAI,GAAG,IAAI,WAAI,CAAC,EAAE,EAAE,EAAE,cAAc,EAAE,GAAG,EAAE,GAAG,EAAE,EAAE,KAAK,CAAC,CAAC;gBAC/D,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,EAAE,EAAE,IAAI,CAAC,CAAC;YAC5B,CAAC;QACH,CAAC;QAED,IAAI,CAAC,YAAY,GAAG,yBAAW,CAAC,MAAM,CACpC,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,OAAO,EAAE,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,KAAK,CAAC,EAAc,EAAE;YAChE,OAAO,EAAE,EAAE,EAAE,KAAK,EAAE,KAAK,CAAC,cAAc,EAAE,KAAK,EAAE,EAAE,EAAE,CAAC;QACxD,CAAC,CAAC,CACH,CAAC,OAAO,EAAE,CAAC;IACd,CAAC;IAED,IAAW,OAAO;QAChB,OAAO,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC;IACzB,CAAC;IAED,IAAW,UAAU;QACnB,OAAO,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC;IAC5B,CAAC;IAED,IAAW,IAAI;QACb,OAAO,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,MAAM,EAAE,CAAC,CAAC;IACzC,CAAC;IAED,IAAW,IAAI;QACb,OAAO,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,QAAQ,CAAC,MAAM,EAAE,CAAC,CAAC;IAC5C,CAAC;IAED,IAAW,QAAQ;QACjB,OAAO,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,SAAS,CAAC,MAAM,EAAE,CAAC,CAAC;IAC7C,CAAC;IAED,IAAW,KAAK;QACd,OAAO,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,MAAM,EAAE,CAAC,CAAC;IAC1C,CAAC;IAED,IAAW,KAAK;QACd,OAAO,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,MAAM,EAAE,CAAC,CAAC;IAC1C,CAAC;IAED;;OAEG;IACO,MAAM,CAAC,eAAe,CAAC,OAAe,EAAE,OAAe;QAC/D,MAAM,KAAK,GAAqB,EAAE,CAAC;QACnC,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,OAAO,EAAE,CAAC,EAAE,EAAE,CAAC;YACjC,MAAM,EAAE,GAAG,SAAG,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC;YAC5B,MAAM,OAAO,GAAG,SAAG,CAAC,OAAO,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,OAAO,CAAC,CAAC;YAC9C,6DAA6D;YAC7D,IAAI,OAAO,CAAC,SAAS,EAAE,EAAE,CAAC;gBACxB,OAAO,IAAA,eAAI,EAAC,OAAO,CAAC,OAAO,CAAC,CAAC;YAC/B,CAAC;YAED,MAAM,MAAM,GAAG,WAAI,CAAC,MAAM,CAAC,EAAE,EAAE,KAAK,EAAE,cAAc,EAAE,OAAO,CAAC,KAAK,CAAC,CAAC,SAAS,CAAC,CAAC,IAAI,EAAE,EAAE;gBACtF,KAAK,CAAC,IAAI,CAAC,CAAC,EAAE,EAAE,IAAI,CAAC,CAAC,CAAC;gBACvB,OAAO,IAAA,kBAAO,EAAC,IAAI,CAAC,CAAC;YACvB,CAAC,CAAC,CAAC;YACH,6DAA6D;YAC7D,IAAI,MAAM,CAAC,SAAS,EAAE,EAAE,CAAC;gBACvB,OAAO,IAAA,eAAI,EAAC,MAAM,CAAC,OAAO,CAAC,CAAC;YAC9B,CAAC;QACH,CAAC;QACD,OAAO,IAAA,kBAAO,EAAC,KAAK,CAAC,CAAC;IACxB,CAAC;IAED;;OAEG;IACO,MAAM,CAAC,kBAAkB,CAAC,OAAe,EAAE,OAAe;QAClE,MAAM,KAAK,GAAqB,EAAE,CAAC;QACnC,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,OAAO,EAAE,CAAC,EAAE,EAAE,CAAC;YACjC,MAAM,EAAE,GAAG,SAAG,CAAC,YAAY,CAAC,CAAC,CAAC,CAAC;YAC/B,MAAM,OAAO,GAAG,SAAG,CAAC,OAAO,CAAC,CAAC,EAAE,OAAO,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC;YAC9C,6DAA6D;YAC7D,IAAI,OAAO,CAAC,SAAS,EAAE,EAAE,CAAC;gBACxB,OAAO,IAAA,eAAI,EAAC,OAAO,CAAC,OAAO,CAAC,CAAC;YAC/B,CAAC;YAED,MAAM,MAAM,GAAG,WAAI,CAAC,MAAM,CAAC,EAAE,EAAE,QAAQ,EAAE,cAAc,EAAE,OAAO,CAAC,KAAK,CAAC,CAAC,SAAS,CAAC,CAAC,IAAI,EAAE,EAAE;gBACzF,KAAK,CAAC,IAAI,CAAC,CAAC,EAAE,EAAE,IAAI,CAAC,CAAC,CAAC;gBACvB,OAAO,IAAA,kBAAO,EAAC,IAAI,CAAC,CAAC;YACvB,CAAC,CAAC,CAAC;YACH,6DAA6D;YAC7D,IAAI,MAAM,CAAC,SAAS,EAAE,EAAE,CAAC;gBACvB,OAAO,IAAA,eAAI,EAAC,MAAM,CAAC,OAAO,CAAC,CAAC;YAC9B,CAAC;QACH,CAAC;QACD,OAAO,IAAA,kBAAO,EAAC,KAAK,CAAC,CAAC;IACxB,CAAC;IAED;;OAEG;IACK,MAAM,CAAC,mBAAmB,CAAC,OAAe,EAAE,OAAe;QACjE,MAAM,KAAK,GAAqB,EAAE,CAAC;QACnC,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,OAAO,EAAE,CAAC,IAAI,CAAC,EAAE,CAAC;YACpC,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,OAAO,EAAE,CAAC,IAAI,CAAC,EAAE,CAAC;gBACpC,MAAM,EAAE,GAAG,SAAG,CAAC,aAAa,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;gBACnC,MAAM,OAAO,GAAG,SAAG,CAAC,OAAO,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC;gBACxC,6DAA6D;gBAC7D,IAAI,OAAO,CAAC,SAAS,EAAE,EAAE,CAAC;oBACxB,OAAO,IAAA,eAAI,EAAC,OAAO,CAAC,OAAO,CAAC,CAAC;gBAC/B,CAAC;gBAED,MAAM,MAAM,GAAG,WAAI,CAAC,MAAM,CAAC,EAAE,EAAE,SAAS,EAAE,cAAc,EAAE,OAAO,CAAC,KAAK,CAAC,CAAC,SAAS,CAAC,CAAC,IAAI,EAAE,EAAE;oBAC1F,KAAK,CAAC,IAAI,CAAC,CAAC,EAAE,EAAE,IAAI,CAAC,CAAC,CAAC;oBACvB,OAAO,IAAA,kBAAO,EAAC,IAAI,CAAC,CAAC;gBACvB,CAAC,CAAC,CAAC;gBACH,6DAA6D;gBAC7D,IAAI,MAAM,CAAC,SAAS,EAAE,EAAE,CAAC;oBACvB,OAAO,IAAA,eAAI,EAAC,MAAM,CAAC,OAAO,CAAC,CAAC;gBAC9B,CAAC;YACH,CAAC;QACH,CAAC;QACD,OAAO,IAAA,kBAAO,EAAC,KAAK,CAAC,CAAC;IACxB,CAAC;IAEM,aAAa,CAAC,KAAkB;QACrC,KAAK,MAAM,EAAE,IAAI,IAAI,CAAC,MAAM,CAAC,IAAI,EAAE,EAAE,CAAC;YACpC,IAAI,CAAC,KAAK,CAAC,QAAQ,CAAC,EAAE,CAAC,EAAE,CAAC;gBACxB,OAAO,KAAK,CAAC;YACf,CAAC;QACH,CAAC;QACD,KAAK,MAAM,IAAI,IAAI,IAAI,CAAC,MAAM,CAAC,MAAM,EAAE,EAAE,CAAC;YACxC,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,KAAK,CAAC,EAAE,CAAC;gBACzB,OAAO,KAAK,CAAC;YACf,CAAC;QACH,CAAC;QACD,OAAO,IAAI,CAAC;IACd,CAAC;IAEM,YAAY,CAAC,KAAkB;QACpC,KAAK,MAAM,IAAI,IAAI,IAAI,CAAC,MAAM,CAAC,MAAM,EAAE,EAAE,CAAC;YACxC,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,KAAK,CAAC,EAAE,CAAC;gBACzB,OAAO,KAAK,CAAC;YACf,CAAC;QACH,CAAC;QACD,OAAO,IAAI,CAAC;IACd,CAAC;IAEM,aAAa,CAAC,KAAkB;QACrC,OAAO,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,MAAM,EAAE,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,KAAK,CAAC,QAAQ,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;IAC/E,CAAC;IAEM,eAAe,CAAC,KAAkB;QACvC,OAAO,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,MAAM,EAAE,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC,CAAC;IAC3E,CAAC;IAEM,eAAe,CACpB,IAAyB,EACzB,KAAkB;QAElB,OAAO,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,SAAS,CAAC,CAAC,IAAI,EAAE,EAAE;YAC3C,IAAI,IAAI,CAAC,SAAS,EAAE,CAAC;gBACnB,MAAM,QAAQ,GAAkB,EAAE,KAAK,EAAE,IAAI,CAAC,cAAc,EAAE,KAAK,EAAE,EAAE,EAAE,CAAC;gBAC1E,OAAO,IAAA,kBAAO,EAAC,EAAE,IAAI,EAAE,QAAQ,EAAE,CAAC,CAAC;YACrC,CAAC;YACD,OAAO,KAAK,CAAC,eAAe,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC,SAAS,CAAC,CAAC,QAAuB,EAAE,EAAE;gBAC1E,OAAO,IAAA,kBAAO,EAAC,EAAE,IAAI,EAAE,QAAQ,EAAE,CAAC,CAAC;YACrC,CAAC,CAAC,CAAC;QACL,CAAC,CAAC,CAAC;IACL,CAAC;IAEM,OAAO,CAAC,IAAiC;QAC9C,MAAM,IAAI,GAAG,SAAG,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC;QAC9B,IAAI,IAAI,CAAC,SAAS,EAAE,EAAE,CAAC;YACrB,OAAO,IAAA,eAAI,EAAC,IAAI,CAAC,OAAO,CAAC,CAAC;QAC5B,CAAC;QAED,MAAM,IAAI,GAAG,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;QACzC,OAAO,IAAI,CAAC,CAAC,CAAC,IAAA,kBAAO,EAAC,IAAI,CAAC,CAAC,CAAC,CAAC,IAAA,eAAI,EAAC,QAAQ,IAAI,CAAC,KAAK,YAAY,CAAC,CAAC;IACrE,CAAC;IAEM,eAAe,CACpB,IAAiC,EACjC,SAA8B,EAC9B,IAAoB;QAEpB,OAAO,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,SAAS,CAAC,CAAC,IAAI,EAAE,EAAE;YAC3C,MAAM,IAAI,GACR,SAAS,KAAK,MAAM,IAAI,SAAS,KAAK,OAAO;gBAC3C,CAAC,CAAC,IAAI,CAAC,WAAW,CAAC,IAAI,EAAE,SAAS,EAAE,IAAI,CAAC;gBACzC,CAAC,CAAC,IAAI,CAAC,QAAQ,CAAC,IAAI,EAAE,SAAS,EAAE,IAAI,CAAC,CAAC;YAC3C,OAAO,IAAI,CAAC,SAAS,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC;QACtD,CAAC,CAAC,CAAC;IACL,CAAC;IAEM,cAAc,CAAC,WAAsC,EAAE,KAAkB;QAC9E,WAAW,GAAG,KAAK,CAAC,OAAO,CAAC,WAAW,CAAC,CAAC,CAAC,CAAC,WAAW,CAAC,CAAC,CAAC,CAAC,WAAW,CAAC,CAAC;QACvE,OAAO,IAAA,qBAAU,EACf,WAAW,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CACpB,IAAI,CAAC,eAAe,CAAC,CAAC,CAAC,EAAE,EAAE,KAAK,CAAC,CAAC,SAAS,CAAC,CAAC,QAAQ,EAAE,EAAE,CACvD,QAAQ,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,KAAK,EAAE,CAAC,CAAC,KAAK,CAAC,CAAC,SAAS,CAAC,CAAC,EAAE,EAAE,EAAE;YACtD,MAAM,IAAI,mBAAiB,EAAE,EAAE,CAAC,CAAC,EAAE,IAAK,QAAQ,CAAC,QAAQ,CAAE,CAAC;YAC5D,OAAO,IAAA,kBAAO,EAAC,EAAE,IAAI,EAAE,EAAE,EAAE,CAAC,CAAC;QAC/B,CAAC,CAAC,CACH,CACF,CACF,CAAC,SAAS,CAAC,CAAC,WAAW,EAAE,EAAE;YAC1B,OAAO,KAAK,CAAC,MAAM,CAAC,WAAW,CAAC,GAAG,CAAC,CAAC,EAAE,EAAE,EAAE,EAAE,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,YAAyB,EAAE,EAAE;gBAC3F,OAAO,IAAA,kBAAO,EAAC;oBACb,IAAI,EAAE,KAAK;oBACX,EAAE,EAAE,YAAY;oBAChB,KAAK,EAAE,WAAW;iBACnB,CAAC,CAAC;YACL,CAAC,CAAC,CAAC;QACL,CAAC,CAAC,CAAC;IACL,CAAC;IAEM,YAAY,CAAC,WAAsC,EAAE,KAAkB;QAC5E,WAAW,GAAG,KAAK,CAAC,OAAO,CAAC,WAAW,CAAC,CAAC,CAAC,CAAC,WAAW,CAAC,CAAC,CAAC,CAAC,WAAW,CAAC,CAAC;QACvE,OAAO,IAAA,qBAAU,EACf,WAAW,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CACpB,IAAI,CAAC,eAAe,CAAC,CAAC,CAAC,EAAE,EAAE,KAAK,CAAC,CAAC,SAAS,CAAC,CAAC,QAAQ,EAAE,EAAE,CACvD,QAAQ,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,KAAK,EAAE,QAAQ,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC,SAAS,CAAC,CAAC,EAAE,EAAE,EAAE;YACtE,MAAM,IAAI,mBAAiB,EAAE,EAAE,CAAC,CAAC,EAAE,IAAK,QAAQ,CAAC,QAAQ,CAAE,CAAC;YAC5D,OAAO,IAAA,kBAAO,EAAC,EAAE,IAAI,EAAE,EAAE,EAAE,CAAC,CAAC;QAC/B,CAAC,CAAC,CACH,CACF,CACF,CAAC,SAAS,CAAC,CAAC,WAAW,EAAE,EAAE;YAC1B,OAAO,KAAK,CAAC,MAAM,CAAC,WAAW,CAAC,GAAG,CAAC,CAAC,EAAE,EAAE,EAAE,EAAE,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,YAAyB,EAAE,EAAE;gBAC3F,OAAO,IAAA,kBAAO,EAAC;oBACb,IAAI,EAAE,KAAK;oBACX,EAAE,EAAE,YAAY;oBAChB,KAAK,EAAE,WAAW;iBACnB,CAAC,CAAC;YACL,CAAC,CAAC,CAAC;QACL,CAAC,CAAC,CAAC;IACL,CAAC;IAEM,WAAW,CAAC,WAAsC,EAAE,KAAkB;QAC3E,WAAW,GAAG,KAAK,CAAC,OAAO,CAAC,WAAW,CAAC,CAAC,CAAC,CAAC,WAAW,CAAC,CAAC,CAAC,CAAC,WAAW,CAAC,CAAC;QACvE,OAAO,IAAA,qBAAU,EACf,WAAW,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CACpB,IAAI,CAAC,eAAe,CAAC,CAAC,CAAC,EAAE,EAAE,KAAK,CAAC,CAAC,SAAS,CAAC,CAAC,QAAQ,EAAE,EAAE,CACvD,QAAQ,CAAC,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,QAAQ,CAAC,KAAK,EAAE,CAAC,CAAC,KAAK,CAAC,CAAC,SAAS,CAAC,CAAC,EAAE,EAAE,EAAE;YACtE,MAAM,IAAI,mBAAiB,EAAE,EAAE,CAAC,CAAC,EAAE,IAAK,QAAQ,CAAC,QAAQ,CAAE,CAAC;YAC5D,OAAO,IAAA,kBAAO,EAAC,EAAE,IAAI,EAAE,EAAE,EAAE,CAAC,CAAC;QAC/B,CAAC,CAAC,CACH,CACF,CACF,CAAC,SAAS,CAAC,CAAC,WAAW,EAAE,EAAE;YAC1B,OAAO,KAAK,CAAC,MAAM,CAAC,WAAW,CAAC,GAAG,CAAC,CAAC,EAAE,EAAE,EAAE,EAAE,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,YAAyB,EAAE,EAAE;gBAC3F,OAAO,IAAA,kBAAO,EAAC;oBACb,IAAI,EAAE,KAAK;oBACX,EAAE,EAAE,YAAY;oBAChB,KAAK,EAAE,WAAW;iBACnB,CAAC,CAAC;YACL,CAAC,CAAC,CAAC;QACL,CAAC,CAAC,CAAC;IACL,CAAC;IAEM,eAAe,CACpB,IAAyB,EACzB,KAAyB,EACzB,KAAkB;QAElB,MAAM,QAAQ,GAAG,OAAO,IAAI,KAAK,QAAQ,CAAC,CAAC,CAAC,SAAG,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,SAAG,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC;QAChF,MAAM,KAAK,GAAa,EAAE,CAAC;QAC3B,OAAO,QAAQ,CAAC,SAAS,CAAC,CAAC,EAAE,EAAE,EAAE;YAC/B,MAAM,MAAM,GAAe,EAAE,EAAE,EAAE,KAAK,EAAE,KAAK,EAAE,CAAC;YAChD,OAAO,IAAI,CAAC,YAAY,CAAC,CAAC,MAAM,CAAC,EAAE,KAAK,CAAC,CAAC;QAC5C,CAAC,CAAC,CAAC;IACL,CAAC;IAEM,eAAe,CACpB,IAAyB,EACzB,KAAe,EACf,KAAkB;QAElB,MAAM,QAAQ,GAAG,OAAO,IAAI,KAAK,QAAQ,CAAC,CAAC,CAAC,SAAG,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,SAAG,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC;QAChF,MAAM,KAAK,GAAG,SAAS,CAAC;QACxB,OAAO,QAAQ,CAAC,SAAS,CAAC,CAAC,EAAE,EAAE,EAAE;YAC/B,MAAM,MAAM,GAAe,EAAE,EAAE,EAAE,KAAK,EAAE,KAAK,EAAE,CAAC;YAChD,OAAO,IAAI,CAAC,WAAW,CAAC,CAAC,MAAM,CAAC,EAAE,KAAK,CAAC,CAAC;QAC3C,CAAC,CAAC,CAAC;IACL,CAAC;IAEM,MAAM,CAAC,GAAoB;QAChC,MAAM,EAAE,GAAG,OAAO,GAAG,KAAK,QAAQ,CAAC,CAAC,CAAC,SAAG,CAAC,SAAS,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC;QAC9D,MAAM,IAAI,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;QAChC,OAAO,IAAI,CAAC,CAAC,CAAC,IAAA,kBAAO,EAAC,IAAI,CAAC,CAAC,CAAC,CAAC,IAAA,eAAI,EAAC,OAAO,EAAE,YAAY,CAAC,CAAC;IAC5D,CAAC;IAEM,SAAS,CAAC,GAAoB;QACnC,MAAM,EAAE,GAAG,OAAO,GAAG,KAAK,QAAQ,CAAC,CAAC,CAAC,SAAG,CAAC,YAAY,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC;QACjE,MAAM,IAAI,GAAG,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;QACnC,OAAO,IAAI,CAAC,CAAC,CAAC,IAAA,kBAAO,EAAC,IAAI,CAAC,CAAC,CAAC,CAAC,IAAA,eAAI,EAAC,UAAU,EAAE,YAAY,CAAC,CAAC;IAC/D,CAAC;IAEM,UAAU,CAAC,IAAyB;QACzC,MAAM,EAAE,GAAG,OAAO,IAAI,KAAK,QAAQ,CAAC,CAAC,CAAC,SAAG,CAAC,aAAa,CAAC,IAAI,CAAC,GAAG,EAAE,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC;QACnF,MAAM,IAAI,GAAG,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;QACpC,OAAO,IAAI,CAAC,CAAC,CAAC,IAAA,kBAAO,EAAC,IAAI,CAAC,CAAC,CAAC,CAAC,IAAA,eAAI,EAAC,WAAW,EAAE,YAAY,CAAC,CAAC;IAChE,CAAC;IAEM,OAAO,CAAC,EAAU;QACvB,MAAM,IAAI,GAAG,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;QACjC,OAAO,IAAI,CAAC,CAAC,CAAC,IAAA,kBAAO,EAAC,IAAI,CAAC,CAAC,CAAC,CAAC,IAAA,eAAI,EAAC,QAAQ,EAAE,YAAY,CAAC,CAAC;IAC7D,CAAC;IAEM,SAAS,CAAC,KAAkB;QACjC,OAAO,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,MAAM,EAAE,CAAC,CAAC,GAAG,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,GAAG,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC,CAAC;IAC3E,CAAC;IAEM,QAAQ,CAAC,KAAkB;QAChC,OAAO,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IAC1C,CAAC;IAEO,WAAW,CACjB,OAAmB,EACnB,SAA2B,EAC3B,IAAoB;QAEpB,MAAM,GAAG,GAAG,OAAO,CAAC,GAAG,CAAC;QAExB,IAAI,GAAG,GAAG,OAAO,CAAC,GAAG,CAAC;QACtB,IAAI,SAAS,KAAK,MAAM,EAAE,CAAC;YACzB,IAAI,GAAG,GAAG,CAAC,EAAE,CAAC;gBACZ,GAAG,GAAG,GAAG,GAAG,CAAC,CAAC;YAChB,CAAC;iBAAM,IAAI,IAAI,KAAK,MAAM,EAAE,CAAC;gBAC3B,GAAG,GAAG,IAAI,CAAC,UAAU,GAAG,CAAC,CAAC;gBAC1B,IAAI,IAAI,KAAK,WAAW,EAAE,CAAC;oBACzB,OAAO,IAAI,CAAC,QAAQ,CAAC,EAAE,GAAG,EAAE,GAAG,EAAE,EAAE,IAAI,EAAE,aAAa,CAAC,CAAC;gBAC1D,CAAC;YACH,CAAC;iBAAM,CAAC;gBACN,OAAO,IAAA,eAAI,EAAC,gCAAgC,OAAO,CAAC,GAAG,EAAE,CAAC,CAAC;YAC7D,CAAC;QACH,CAAC;aAAM,IAAI,SAAS,KAAK,OAAO,EAAE,CAAC;YACjC,IAAI,GAAG,GAAG,IAAI,CAAC,UAAU,GAAG,CAAC,EAAE,CAAC;gBAC9B,GAAG,GAAG,GAAG,GAAG,CAAC,CAAC;YAChB,CAAC;iBAAM,IAAI,IAAI,KAAK,MAAM,EAAE,CAAC;gBAC3B,GAAG,GAAG,CAAC,CAAC;gBACR,IAAI,IAAI,KAAK,WAAW,EAAE,CAAC;oBACzB,OAAO,IAAI,CAAC,QAAQ,CAAC,EAAE,GAAG,EAAE,GAAG,EAAE,EAAE,MAAM,EAAE,aAAa,CAAC,CAAC;gBAC5D,CAAC;YACH,CAAC;iBAAM,CAAC;gBACN,OAAO,IAAA,eAAI,EAAC,iCAAiC,OAAO,CAAC,GAAG,EAAE,CAAC,CAAC;YAC9D,CAAC;QACH,CAAC;QACD,OAAO,IAAA,kBAAO,EAAC,EAAE,GAAG,EAAE,GAAG,EAAE,CAAC,CAAC;IAC/B,CAAC;IAEO,QAAQ,CAAC,OAAmB,EAAE,SAAwB,EAAE,IAAoB;QAClF,IAAI,GAAG,GAAG,OAAO,CAAC,GAAG,CAAC;QACtB,MAAM,GAAG,GAAG,OAAO,CAAC,GAAG,CAAC;QAExB,IAAI,SAAS,KAAK,IAAI,EAAE,CAAC;YACvB,IAAI,GAAG,GAAG,CAAC,EAAE,CAAC;gBACZ,GAAG,GAAG,GAAG,GAAG,CAAC,CAAC;YAChB,CAAC;iBAAM,IAAI,IAAI,KAAK,MAAM,EAAE,CAAC;gBAC3B,GAAG,GAAG,IAAI,CAAC,OAAO,GAAG,CAAC,CAAC;gBACvB,IAAI,IAAI,KAAK,WAAW,EAAE,CAAC;oBACzB,OAAO,IAAI,CAAC,WAAW,CAAC,EAAE,GAAG,EAAE,GAAG,EAAE,EAAE,MAAM,EAAE,aAAa,CAAC,CAAC;gBAC/D,CAAC;YACH,CAAC;iBAAM,CAAC;gBACN,OAAO,IAAA,eAAI,EAAC,2BAA2B,OAAO,CAAC,GAAG,EAAE,CAAC,CAAC;YACxD,CAAC;QACH,CAAC;aAAM,IAAI,SAAS,KAAK,MAAM,EAAE,CAAC;YAChC,IAAI,GAAG,GAAG,IAAI,CAAC,OAAO,GAAG,CAAC,EAAE,CAAC;gBAC3B,GAAG,GAAG,GAAG,GAAG,CAAC,CAAC;YAChB,CAAC;iBAAM,IAAI,IAAI,KAAK,MAAM,EAAE,CAAC;gBAC3B,GAAG,GAAG,CAAC,CAAC;gBACR,IAAI,IAAI,KAAK,WAAW,EAAE,CAAC;oBACzB,OAAO,IAAI,CAAC,WAAW,CAAC,EAAE,GAAG,EAAE,GAAG,EAAE,EAAE,OAAO,EAAE,aAAa,CAAC,CAAC;gBAChE,CAAC;YACH,CAAC;iBAAM,CAAC;gBACN,OAAO,IAAA,eAAI,EAAC,6BAA6B,OAAO,CAAC,GAAG,EAAE,CAAC,CAAC;YAC1D,CAAC;QACH,CAAC;QACD,OAAO,IAAA,kBAAO,EAAC,EAAE,GAAG,EAAE,GAAG,EAAE,CAAC,CAAC;IAC/B,CAAC;CACF;AA1cD,wBA0cC","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
+ {"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 = 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 = 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"]}
package/package.json CHANGED
@@ -1,9 +1,9 @@
1
1
  {
2
2
  "name": "@fgv/ts-sudoku-lib",
3
- "version": "4.5.0-3",
3
+ "version": "4.5.0",
4
4
  "description": "Sudoku rules library",
5
5
  "main": "lib/index.js",
6
- "types": "dist/ts-json.d.ts",
6
+ "types": "dist/ts-sudoku-lib.d.ts",
7
7
  "keywords": [
8
8
  "typescript",
9
9
  "node"
@@ -16,42 +16,42 @@
16
16
  "homepage": "https://github.com/ErikFortune/fgv/libraries/ts-sudoku-lib#readme",
17
17
  "sideEffects": false,
18
18
  "devDependencies": {
19
- "@fgv/ts-utils": "4.5.0-3",
20
- "@fgv/ts-utils-jest": "4.5.0-3",
21
- "@microsoft/api-documenter": "^7.26.17",
22
- "@microsoft/api-extractor": "^7.52.1",
19
+ "@fgv/ts-utils": "4.5.0",
20
+ "@fgv/ts-utils-jest": "4.5.0",
21
+ "@microsoft/api-documenter": "^7.26.5",
22
+ "@microsoft/api-extractor": "^7.49.1",
23
23
  "@types/jest": "^29.5.14",
24
- "@types/node": "^22.13.11",
25
- "@typescript-eslint/eslint-plugin": "^8.27.0",
26
- "@typescript-eslint/parser": "^8.27.0",
24
+ "@types/node": "^20.14.9",
25
+ "@typescript-eslint/eslint-plugin": "^7.14.1",
26
+ "@typescript-eslint/parser": "^7.14.1",
27
27
  "cspell": "^8.3.2",
28
28
  "eslint": "^8.57.0",
29
- "eslint-config-prettier": "^10.1.1",
29
+ "eslint-config-prettier": "^9.1.0",
30
30
  "eslint-plugin-header": "^3.1.1",
31
31
  "eslint-plugin-import": "^2.31.0",
32
32
  "eslint-plugin-node": "^11.1.0",
33
- "eslint-plugin-prettier": "^5.2.3",
34
- "eslint-plugin-promise": "^7.2.1",
33
+ "eslint-plugin-prettier": "^5.2.1",
34
+ "eslint-plugin-promise": "^6.2.0",
35
35
  "jest": "^29.7.0",
36
- "prettier": "^3.5.3",
37
- "rimraf": "^6.0.1",
38
- "ts-jest": "^29.2.6",
36
+ "prettier": "^3.4.2",
37
+ "rimraf": "^5.0.7",
38
+ "ts-jest": "^29.2.5",
39
39
  "ts-node": "^10.9.2",
40
- "typescript": "^5.8.2",
41
- "eslint-plugin-n": "^17.16.2",
42
- "@rushstack/heft": "~0.71.0",
43
- "@rushstack/heft-node-rig": "~2.8.2",
40
+ "typescript": "^5.7.3",
41
+ "eslint-plugin-n": "^16.6.2",
42
+ "@rushstack/heft": "~0.68.13",
43
+ "@rushstack/heft-node-rig": "~2.6.49",
44
44
  "@types/heft-jest": "1.0.6",
45
- "@rushstack/eslint-config": "~4.3.0",
46
- "@rushstack/heft-jest-plugin": "~0.15.2",
45
+ "@rushstack/eslint-config": "~3.7.0",
46
+ "@rushstack/heft-jest-plugin": "~0.14.3",
47
47
  "eslint-plugin-tsdoc": "~0.4.0",
48
- "@fgv/ts-json-base": "4.5.0-3"
48
+ "@fgv/ts-json-base": "4.5.0"
49
49
  },
50
50
  "peerDependencies": {
51
- "@fgv/ts-utils": "4.5.0-3"
51
+ "@fgv/ts-utils": "4.5.0"
52
52
  },
53
53
  "scripts": {
54
- "build": "heft test --clean",
54
+ "build": "heft build --clean",
55
55
  "clean": "heft clean",
56
56
  "test": "heft test --clean",
57
57
  "build-docs": "api-documenter markdown --input-folder ./temp --output-folder docs",