puzlink 0.1.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.
Files changed (233) hide show
  1. package/LICENSE.md +21 -0
  2. package/README.md +35 -0
  3. package/dist/data/answerLengths.d.ts +10 -0
  4. package/dist/data/answerLengths.d.ts.map +1 -0
  5. package/dist/data/answerLengths.js +63 -0
  6. package/dist/data/answerLengths.js.map +1 -0
  7. package/dist/data/categories/compass.d.ts +3 -0
  8. package/dist/data/categories/compass.d.ts.map +1 -0
  9. package/dist/data/categories/compass.js +11 -0
  10. package/dist/data/categories/compass.js.map +1 -0
  11. package/dist/data/categories/countryAlpha2.d.ts +3 -0
  12. package/dist/data/categories/countryAlpha2.d.ts.map +1 -0
  13. package/dist/data/categories/countryAlpha2.js +252 -0
  14. package/dist/data/categories/countryAlpha2.js.map +1 -0
  15. package/dist/data/categories/countryAlpha3.d.ts +3 -0
  16. package/dist/data/categories/countryAlpha3.d.ts.map +1 -0
  17. package/dist/data/categories/countryAlpha3.js +252 -0
  18. package/dist/data/categories/countryAlpha3.js.map +1 -0
  19. package/dist/data/categories/daysOfTheWeek.d.ts +3 -0
  20. package/dist/data/categories/daysOfTheWeek.d.ts.map +1 -0
  21. package/dist/data/categories/daysOfTheWeek.js +10 -0
  22. package/dist/data/categories/daysOfTheWeek.js.map +1 -0
  23. package/dist/data/categories/elementSymbols.d.ts +3 -0
  24. package/dist/data/categories/elementSymbols.d.ts.map +1 -0
  25. package/dist/data/categories/elementSymbols.js +121 -0
  26. package/dist/data/categories/elementSymbols.js.map +1 -0
  27. package/dist/data/categories/greekLetters.d.ts +3 -0
  28. package/dist/data/categories/greekLetters.d.ts.map +1 -0
  29. package/dist/data/categories/greekLetters.js +27 -0
  30. package/dist/data/categories/greekLetters.js.map +1 -0
  31. package/dist/data/categories/months.d.ts +3 -0
  32. package/dist/data/categories/months.d.ts.map +1 -0
  33. package/dist/data/categories/months.js +15 -0
  34. package/dist/data/categories/months.js.map +1 -0
  35. package/dist/data/categories/natoAlphabet.d.ts +3 -0
  36. package/dist/data/categories/natoAlphabet.d.ts.map +1 -0
  37. package/dist/data/categories/natoAlphabet.js +29 -0
  38. package/dist/data/categories/natoAlphabet.js.map +1 -0
  39. package/dist/data/categories/numbers.d.ts +3 -0
  40. package/dist/data/categories/numbers.d.ts.map +1 -0
  41. package/dist/data/categories/numbers.js +16 -0
  42. package/dist/data/categories/numbers.js.map +1 -0
  43. package/dist/data/categories/romanNumerals.d.ts +3 -0
  44. package/dist/data/categories/romanNumerals.d.ts.map +1 -0
  45. package/dist/data/categories/romanNumerals.js +134 -0
  46. package/dist/data/categories/romanNumerals.js.map +1 -0
  47. package/dist/data/categories/solfege.d.ts +3 -0
  48. package/dist/data/categories/solfege.d.ts.map +1 -0
  49. package/dist/data/categories/solfege.js +11 -0
  50. package/dist/data/categories/solfege.js.map +1 -0
  51. package/dist/data/categories/usStateAbbreviations.d.ts +3 -0
  52. package/dist/data/categories/usStateAbbreviations.d.ts.map +1 -0
  53. package/dist/data/categories/usStateAbbreviations.js +53 -0
  54. package/dist/data/categories/usStateAbbreviations.js.map +1 -0
  55. package/dist/data/categories.d.ts +10 -0
  56. package/dist/data/categories.d.ts.map +1 -0
  57. package/dist/data/categories.js +31 -0
  58. package/dist/data/categories.js.map +1 -0
  59. package/dist/data/knownLogProbs.d.ts +6 -0
  60. package/dist/data/knownLogProbs.d.ts.map +1 -0
  61. package/dist/data/knownLogProbs.js +2975 -0
  62. package/dist/data/knownLogProbs.js.map +1 -0
  63. package/dist/data/morse.d.ts +2 -0
  64. package/dist/data/morse.d.ts.map +1 -0
  65. package/dist/data/morse.js +29 -0
  66. package/dist/data/morse.js.map +1 -0
  67. package/dist/data/scrabble.d.ts +2 -0
  68. package/dist/data/scrabble.d.ts.map +1 -0
  69. package/dist/data/scrabble.js +29 -0
  70. package/dist/data/scrabble.js.map +1 -0
  71. package/dist/features/index.d.ts +32 -0
  72. package/dist/features/index.d.ts.map +1 -0
  73. package/dist/features/index.js +79 -0
  74. package/dist/features/index.js.map +1 -0
  75. package/dist/features/letterCount.d.ts +7 -0
  76. package/dist/features/letterCount.d.ts.map +1 -0
  77. package/dist/features/letterCount.js +121 -0
  78. package/dist/features/letterCount.js.map +1 -0
  79. package/dist/features/letterSequence.d.ts +7 -0
  80. package/dist/features/letterSequence.d.ts.map +1 -0
  81. package/dist/features/letterSequence.js +155 -0
  82. package/dist/features/letterSequence.js.map +1 -0
  83. package/dist/features/logProbCache.d.ts +16 -0
  84. package/dist/features/logProbCache.d.ts.map +1 -0
  85. package/dist/features/logProbCache.js +36 -0
  86. package/dist/features/logProbCache.js.map +1 -0
  87. package/dist/features/other.d.ts +4 -0
  88. package/dist/features/other.d.ts.map +1 -0
  89. package/dist/features/other.js +190 -0
  90. package/dist/features/other.js.map +1 -0
  91. package/dist/features/substring.d.ts +3 -0
  92. package/dist/features/substring.d.ts.map +1 -0
  93. package/dist/features/substring.js +146 -0
  94. package/dist/features/substring.js.map +1 -0
  95. package/dist/features/wordplay.d.ts +7 -0
  96. package/dist/features/wordplay.d.ts.map +1 -0
  97. package/dist/features/wordplay.js +387 -0
  98. package/dist/features/wordplay.js.map +1 -0
  99. package/dist/index.d.ts +4 -0
  100. package/dist/index.d.ts.map +1 -0
  101. package/dist/index.js +3 -0
  102. package/dist/index.js.map +1 -0
  103. package/dist/lib/affixDistribution.d.ts +26 -0
  104. package/dist/lib/affixDistribution.d.ts.map +1 -0
  105. package/dist/lib/affixDistribution.js +105 -0
  106. package/dist/lib/affixDistribution.js.map +1 -0
  107. package/dist/lib/counter.d.ts +23 -0
  108. package/dist/lib/counter.d.ts.map +1 -0
  109. package/dist/lib/counter.js +55 -0
  110. package/dist/lib/counter.js.map +1 -0
  111. package/dist/lib/distribution.d.ts +40 -0
  112. package/dist/lib/distribution.d.ts.map +1 -0
  113. package/dist/lib/distribution.js +176 -0
  114. package/dist/lib/distribution.js.map +1 -0
  115. package/dist/lib/lengthDistribution.d.ts +30 -0
  116. package/dist/lib/lengthDistribution.d.ts.map +1 -0
  117. package/dist/lib/lengthDistribution.js +137 -0
  118. package/dist/lib/lengthDistribution.js.map +1 -0
  119. package/dist/lib/letterBitset.d.ts +49 -0
  120. package/dist/lib/letterBitset.d.ts.map +1 -0
  121. package/dist/lib/letterBitset.js +101 -0
  122. package/dist/lib/letterBitset.js.map +1 -0
  123. package/dist/lib/letterDistribution.d.ts +60 -0
  124. package/dist/lib/letterDistribution.d.ts.map +1 -0
  125. package/dist/lib/letterDistribution.js +230 -0
  126. package/dist/lib/letterDistribution.js.map +1 -0
  127. package/dist/lib/letterIndices.d.ts +13 -0
  128. package/dist/lib/letterIndices.d.ts.map +1 -0
  129. package/dist/lib/letterIndices.js +41 -0
  130. package/dist/lib/letterIndices.js.map +1 -0
  131. package/dist/lib/logCounter.d.ts +23 -0
  132. package/dist/lib/logCounter.d.ts.map +1 -0
  133. package/dist/lib/logCounter.js +49 -0
  134. package/dist/lib/logCounter.js.map +1 -0
  135. package/dist/lib/logNum.d.ts +36 -0
  136. package/dist/lib/logNum.d.ts.map +1 -0
  137. package/dist/lib/logNum.js +193 -0
  138. package/dist/lib/logNum.js.map +1 -0
  139. package/dist/lib/memoize.d.ts +5 -0
  140. package/dist/lib/memoize.d.ts.map +1 -0
  141. package/dist/lib/memoize.js +104 -0
  142. package/dist/lib/memoize.js.map +1 -0
  143. package/dist/lib/util.d.ts +30 -0
  144. package/dist/lib/util.d.ts.map +1 -0
  145. package/dist/lib/util.js +111 -0
  146. package/dist/lib/util.js.map +1 -0
  147. package/dist/lib/wordlist.d.ts +66 -0
  148. package/dist/lib/wordlist.d.ts.map +1 -0
  149. package/dist/lib/wordlist.js +166 -0
  150. package/dist/lib/wordlist.js.map +1 -0
  151. package/dist/linkers/index.d.ts +34 -0
  152. package/dist/linkers/index.d.ts.map +1 -0
  153. package/dist/linkers/index.js +25 -0
  154. package/dist/linkers/index.js.map +1 -0
  155. package/dist/linkers/indexing.d.ts +5 -0
  156. package/dist/linkers/indexing.d.ts.map +1 -0
  157. package/dist/linkers/indexing.js +152 -0
  158. package/dist/linkers/indexing.js.map +1 -0
  159. package/dist/linkers/length.d.ts +5 -0
  160. package/dist/linkers/length.d.ts.map +1 -0
  161. package/dist/linkers/length.js +101 -0
  162. package/dist/linkers/length.js.map +1 -0
  163. package/dist/linkers/letterDistribution.d.ts +4 -0
  164. package/dist/linkers/letterDistribution.d.ts.map +1 -0
  165. package/dist/linkers/letterDistribution.js +46 -0
  166. package/dist/linkers/letterDistribution.js.map +1 -0
  167. package/dist/linkers/other.d.ts +5 -0
  168. package/dist/linkers/other.d.ts.map +1 -0
  169. package/dist/linkers/other.js +90 -0
  170. package/dist/linkers/other.js.map +1 -0
  171. package/dist/parse.d.ts +8 -0
  172. package/dist/parse.d.ts.map +1 -0
  173. package/dist/parse.js +23 -0
  174. package/dist/parse.js.map +1 -0
  175. package/dist/puzlink.d.ts +84 -0
  176. package/dist/puzlink.d.ts.map +1 -0
  177. package/dist/puzlink.js +59 -0
  178. package/dist/puzlink.js.map +1 -0
  179. package/package.json +57 -0
  180. package/src/data/answerLengths.ts +63 -0
  181. package/src/data/categories/README.md +3 -0
  182. package/src/data/categories/compass.ts +1 -0
  183. package/src/data/categories/countryAlpha2.ts +251 -0
  184. package/src/data/categories/countryAlpha3.ts +251 -0
  185. package/src/data/categories/daysOfTheWeek.ts +1 -0
  186. package/src/data/categories/elementSymbols.ts +120 -0
  187. package/src/data/categories/greekLetters.ts +26 -0
  188. package/src/data/categories/months.ts +14 -0
  189. package/src/data/categories/natoAlphabet.ts +28 -0
  190. package/src/data/categories/numbers.ts +15 -0
  191. package/src/data/categories/romanNumerals.ts +133 -0
  192. package/src/data/categories/solfege.ts +1 -0
  193. package/src/data/categories/txt/compass.txt +8 -0
  194. package/src/data/categories/txt/daysOfTheWeek.txt +7 -0
  195. package/src/data/categories/txt/elementSymbols.txt +118 -0
  196. package/src/data/categories/txt/greekLetters.txt +24 -0
  197. package/src/data/categories/txt/months.txt +12 -0
  198. package/src/data/categories/txt/natoAlphabet.txt +26 -0
  199. package/src/data/categories/txt/numbers.txt +13 -0
  200. package/src/data/categories/txt/solfege.txt +8 -0
  201. package/src/data/categories/txt/usStateAbbreviations.txt +50 -0
  202. package/src/data/categories/usStateAbbreviations.ts +52 -0
  203. package/src/data/categories.ts +42 -0
  204. package/src/data/knownLogProbs.ts +2992 -0
  205. package/src/data/morse.ts +28 -0
  206. package/src/data/scrabble.ts +28 -0
  207. package/src/features/index.ts +120 -0
  208. package/src/features/letterCount.ts +174 -0
  209. package/src/features/letterSequence.ts +222 -0
  210. package/src/features/logProbCache.ts +48 -0
  211. package/src/features/other.ts +214 -0
  212. package/src/features/substring.ts +173 -0
  213. package/src/features/wordplay.ts +428 -0
  214. package/src/index.ts +3 -0
  215. package/src/lib/affixDistribution.ts +70 -0
  216. package/src/lib/counter.ts +71 -0
  217. package/src/lib/distribution.ts +162 -0
  218. package/src/lib/lengthDistribution.ts +108 -0
  219. package/src/lib/letterBitset.ts +123 -0
  220. package/src/lib/letterDistribution.ts +236 -0
  221. package/src/lib/letterIndices.ts +51 -0
  222. package/src/lib/logCounter.ts +74 -0
  223. package/src/lib/logNum.ts +193 -0
  224. package/src/lib/memoize.ts +136 -0
  225. package/src/lib/testUtils.ts +1 -0
  226. package/src/lib/util.ts +150 -0
  227. package/src/lib/wordlist.ts +162 -0
  228. package/src/linkers/index.ts +56 -0
  229. package/src/linkers/indexing.ts +194 -0
  230. package/src/linkers/length.ts +122 -0
  231. package/src/linkers/other.ts +117 -0
  232. package/src/parse.ts +20 -0
  233. package/src/puzlink.ts +141 -0
@@ -0,0 +1,104 @@
1
+ /* eslint-disable @typescript-eslint/no-explicit-any */
2
+ function memoizeWith(fn, makeCache) {
3
+ const cache = makeCache();
4
+ const memoized = function (...args) {
5
+ const cached = cache.get(args);
6
+ if (cached !== null) {
7
+ return cached;
8
+ }
9
+ const result = fn.apply(this, args);
10
+ cache.set(args, result);
11
+ return result;
12
+ };
13
+ for (const property of Reflect.ownKeys(fn)) {
14
+ if (property === "length" ||
15
+ property === "prototype" ||
16
+ property === "argunments" ||
17
+ property === "prototype") {
18
+ continue;
19
+ }
20
+ const fnDesc = Object.getOwnPropertyDescriptor(fn, property);
21
+ const mmDesc = Object.getOwnPropertyDescriptor(memoized, property);
22
+ if (mmDesc === undefined ||
23
+ mmDesc.configurable ||
24
+ (mmDesc.writable === fnDesc.writable &&
25
+ mmDesc.enumerable === fnDesc.enumerable &&
26
+ mmDesc.configurable === fnDesc.configurable &&
27
+ (mmDesc.writable || mmDesc.value === fnDesc.value))) {
28
+ Object.defineProperty(memoized, property, fnDesc);
29
+ }
30
+ }
31
+ Object.setPrototypeOf(memoized, Object.getPrototypeOf(fn));
32
+ return memoized;
33
+ }
34
+ function memoizeDecorator(makeCache) {
35
+ return (target) => {
36
+ const instanceMap = new WeakMap();
37
+ return function (...args) {
38
+ let memoized = instanceMap.get(this);
39
+ if (memoized === undefined) {
40
+ memoized = memoizeWith(target, makeCache);
41
+ instanceMap.set(this, memoized);
42
+ }
43
+ return memoized.apply(this, args);
44
+ };
45
+ };
46
+ }
47
+ function memoize1() {
48
+ return memoizeDecorator(() => {
49
+ const cache = new Map();
50
+ return {
51
+ get: ([key]) => {
52
+ return cache.get(key) ?? null;
53
+ },
54
+ set: ([key], value) => {
55
+ return cache.set(key, value);
56
+ },
57
+ };
58
+ });
59
+ }
60
+ function memoize2() {
61
+ return memoizeDecorator(() => {
62
+ const cache = new Map();
63
+ return {
64
+ get: ([outerKey, innerKey]) => {
65
+ return cache.get(outerKey)?.get(innerKey) ?? null;
66
+ },
67
+ set: ([outerKey, innerKey], value) => {
68
+ let inner = cache.get(outerKey);
69
+ if (inner === undefined) {
70
+ inner = new Map();
71
+ cache.set(outerKey, inner);
72
+ }
73
+ inner.set(innerKey, value);
74
+ },
75
+ };
76
+ });
77
+ }
78
+ function memoize3() {
79
+ return memoizeDecorator(() => {
80
+ const cache = new Map();
81
+ return {
82
+ get: ([outerKey, middleKey, innerKey]) => {
83
+ return cache.get(outerKey)?.get(middleKey)?.get(innerKey) ?? null;
84
+ },
85
+ set: ([outerKey, middleKey, innerKey], value) => {
86
+ let middle = cache.get(outerKey);
87
+ if (middle === undefined) {
88
+ middle = new Map();
89
+ cache.set(outerKey, middle);
90
+ }
91
+ let inner = middle.get(middleKey);
92
+ if (inner === undefined) {
93
+ inner = new Map();
94
+ middle.set(middleKey, inner);
95
+ }
96
+ inner.set(innerKey, value);
97
+ },
98
+ };
99
+ });
100
+ }
101
+ export function memoize(levels) {
102
+ return levels === 3 ? memoize3() : levels === 2 ? memoize2() : memoize1();
103
+ }
104
+ //# sourceMappingURL=memoize.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"memoize.js","sourceRoot":"","sources":["../../src/lib/memoize.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,30 @@
1
+ /** Capitalizes the letters of a slug at the given indices. */
2
+ export declare function capitalizeAt(slug: string, indices: number[]): string;
3
+ /** Prints the index of a slug at the given indices. */
4
+ export declare function printIndexSlug(slug: string, indices: number[]): string;
5
+ /** Returns an array of numbers from start to end (inclusive). */
6
+ export declare function interval(start: number, end: number, step?: number): number[];
7
+ type IterMap<A extends any[]> = A extends [infer First, ...infer Rest] ? [Iterable<First>, ...IterMap<Rest>] : [];
8
+ /** Map a function to a product of iterators. */
9
+ export declare function mapProduct<const Args extends any[], R>(fn: (...args: Args) => R, ...args: IterMap<Args>): Generator<R>;
10
+ /** Returns the ordinal suffix of the given number. */
11
+ export declare function ordinal(n: number): string;
12
+ /** Caesar shift a slug. */
13
+ export declare function caesar(slug: string, n: number): string;
14
+ /** Returns an iterator over [index, item] pairs. */
15
+ export declare function enumerate<T>(iter: Iterable<T>): Generator<[number, T]>;
16
+ /** Returns an iterator over windows of the given size. */
17
+ export declare function windows<T>(iter: Iterable<T>, size: 2): Generator<[T, T]>;
18
+ export declare function windows<T>(iter: Iterable<T>, size: 3): Generator<[T, T, T]>;
19
+ export declare function windows<T>(iter: Iterable<T>, size: number): Generator<T[]>;
20
+ /**
21
+ * If the given array is a non-constant arithmetic sequence, returns the start,
22
+ * step, and last. Else, returns null.
23
+ */
24
+ export declare function getArithmeticSequenceInfo(terms: number[]): {
25
+ start: number;
26
+ step: number;
27
+ last: number;
28
+ } | null;
29
+ export {};
30
+ //# sourceMappingURL=util.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"util.d.ts","sourceRoot":"","sources":["../../src/lib/util.ts"],"names":[],"mappings":"AAEA,8DAA8D;AAC9D,wBAAgB,YAAY,CAAC,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,EAAE,GAAG,MAAM,CAMpE;AAED,uDAAuD;AACvD,wBAAgB,cAAc,CAAC,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,EAAE,GAAG,MAAM,CAStE;AAED,iEAAiE;AACjE,wBAAgB,QAAQ,CAAC,KAAK,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,EAAE,IAAI,SAAI,GAAG,MAAM,EAAE,CAMvE;AA4BD,KAAK,OAAO,CAAC,CAAC,SAAS,GAAG,EAAE,IAAI,CAAC,SAAS,CAAC,MAAM,KAAK,EAAE,GAAG,MAAM,IAAI,CAAC,GAClE,CAAC,QAAQ,CAAC,KAAK,CAAC,EAAE,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC,GACnC,EAAE,CAAC;AAEP,gDAAgD;AAChD,wBAAiB,UAAU,CAAC,KAAK,CAAC,IAAI,SAAS,GAAG,EAAE,EAAE,CAAC,EACrD,EAAE,EAAE,CAAC,GAAG,IAAI,EAAE,IAAI,KAAK,CAAC,EACxB,GAAG,IAAI,EAAE,OAAO,CAAC,IAAI,CAAC,GACrB,SAAS,CAAC,CAAC,CAAC,CAId;AAED,sDAAsD;AACtD,wBAAgB,OAAO,CAAC,CAAC,EAAE,MAAM,GAAG,MAAM,CAYzC;AAID,2BAA2B;AAC3B,wBAAgB,MAAM,CAAC,IAAI,EAAE,MAAM,EAAE,CAAC,EAAE,MAAM,GAAG,MAAM,CAOtD;AAED,oDAAoD;AACpD,wBAAiB,SAAS,CAAC,CAAC,EAAE,IAAI,EAAE,QAAQ,CAAC,CAAC,CAAC,GAAG,SAAS,CAAC,CAAC,MAAM,EAAE,CAAC,CAAC,CAAC,CAMvE;AAED,0DAA0D;AAC1D,wBAAgB,OAAO,CAAC,CAAC,EAAE,IAAI,EAAE,QAAQ,CAAC,CAAC,CAAC,EAAE,IAAI,EAAE,CAAC,GAAG,SAAS,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC;AAC1E,wBAAgB,OAAO,CAAC,CAAC,EAAE,IAAI,EAAE,QAAQ,CAAC,CAAC,CAAC,EAAE,IAAI,EAAE,CAAC,GAAG,SAAS,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC;AAC7E,wBAAgB,OAAO,CAAC,CAAC,EAAE,IAAI,EAAE,QAAQ,CAAC,CAAC,CAAC,EAAE,IAAI,EAAE,MAAM,GAAG,SAAS,CAAC,CAAC,EAAE,CAAC,CAAC;AAc5E;;;GAGG;AACH,wBAAgB,yBAAyB,CAAC,KAAK,EAAE,MAAM,EAAE,GAAG;IAC1D,KAAK,EAAE,MAAM,CAAC;IACd,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,CAAC;CACd,GAAG,IAAI,CAgBP"}
@@ -0,0 +1,111 @@
1
+ /* eslint-disable @typescript-eslint/no-explicit-any */
2
+ /** Capitalizes the letters of a slug at the given indices. */
3
+ export function capitalizeAt(slug, indices) {
4
+ const capitalized = [];
5
+ for (let i = 0; i < slug.length; i++) {
6
+ capitalized.push(indices.includes(i) ? slug[i].toUpperCase() : slug[i]);
7
+ }
8
+ return capitalized.join("");
9
+ }
10
+ /** Prints the index of a slug at the given indices. */
11
+ export function printIndexSlug(slug, indices) {
12
+ indices = Array.from(new Set(indices)).sort((a, b) => a - b);
13
+ const isInterval = indices.length > 2 &&
14
+ Math.max(...indices) - Math.min(...indices) === indices.length - 1;
15
+ const indexString = isInterval
16
+ ? `${Math.min(...indices).toString()}..${Math.max(...indices).toString()}`
17
+ : `${indices.slice(0, 5).join(", ")}${indices.length > 5 ? ", ..." : ""}`;
18
+ return `index(${slug}, ${indexString}) = ${capitalizeAt(slug, indices)}`;
19
+ }
20
+ /** Returns an array of numbers from start to end (inclusive). */
21
+ export function interval(start, end, step = 1) {
22
+ const result = [];
23
+ for (let i = start; i <= end; i += step) {
24
+ result.push(i);
25
+ }
26
+ return result;
27
+ }
28
+ /** Cartesian product of iterables. */
29
+ function* product(...args) {
30
+ if (args.length === 1) {
31
+ for (const arg of args[0]) {
32
+ yield [arg];
33
+ }
34
+ return;
35
+ }
36
+ const [first, ...rest] = args;
37
+ for (const a of first) {
38
+ for (const b of product(...rest)) {
39
+ yield [a, ...b];
40
+ }
41
+ }
42
+ }
43
+ /** Map a function to a product of iterators. */
44
+ export function* mapProduct(fn, ...args) {
45
+ for (const arg of product(...args)) {
46
+ yield fn(...arg);
47
+ }
48
+ }
49
+ /** Returns the ordinal suffix of the given number. */
50
+ export function ordinal(n) {
51
+ const suffix = Math.abs(n) % 100 >= 11 && Math.abs(n) % 100 <= 14
52
+ ? "th"
53
+ : Math.abs(n) % 10 === 1
54
+ ? "st"
55
+ : Math.abs(n) % 10 === 2
56
+ ? "nd"
57
+ : Math.abs(n) % 10 === 3
58
+ ? "rd"
59
+ : "th";
60
+ return `${n.toString()}${suffix}`;
61
+ }
62
+ const aCharCode = "a".charCodeAt(0);
63
+ /** Caesar shift a slug. */
64
+ export function caesar(slug, n) {
65
+ n %= 26;
66
+ return Array.from(slug, (c) => {
67
+ return String.fromCharCode(((c.charCodeAt(0) - aCharCode + n + 26) % 26) + aCharCode);
68
+ }).join("");
69
+ }
70
+ /** Returns an iterator over [index, item] pairs. */
71
+ export function* enumerate(iter) {
72
+ let i = 0;
73
+ for (const item of iter) {
74
+ yield [i, item];
75
+ i += 1;
76
+ }
77
+ }
78
+ export function* windows(iter, size) {
79
+ const buffer = [];
80
+ for (const item of iter) {
81
+ if (buffer.length === size) {
82
+ buffer.shift();
83
+ }
84
+ buffer.push(item);
85
+ if (buffer.length === size) {
86
+ yield buffer.slice();
87
+ }
88
+ }
89
+ }
90
+ /**
91
+ * If the given array is a non-constant arithmetic sequence, returns the start,
92
+ * step, and last. Else, returns null.
93
+ */
94
+ export function getArithmeticSequenceInfo(terms) {
95
+ if (terms.length < 2) {
96
+ return null;
97
+ }
98
+ terms.sort((a, b) => a - b);
99
+ const start = terms[0];
100
+ const step = terms[1] - start;
101
+ if (step === 0) {
102
+ return null;
103
+ }
104
+ for (let i = 2; i < terms.length; i++) {
105
+ if (terms[i] - terms[i - 1] !== step) {
106
+ return null;
107
+ }
108
+ }
109
+ return { start, step, last: terms.at(-1) };
110
+ }
111
+ //# sourceMappingURL=util.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"util.js","sourceRoot":"","sources":["../../src/lib/util.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,66 @@
1
+ import { PrefixDistribution, SuffixDistribution } from "./affixDistribution.js";
2
+ import { LetterDistribution } from "./letterDistribution.js";
3
+ import { LogNum } from "./logNum.js";
4
+ /**
5
+ * Info about the words in a wordlist.
6
+ *
7
+ * We assume (as in `cromulence`) that words appearing in puzzles are
8
+ * distributed via Zipf frequency.
9
+ */
10
+ export declare class Wordlist {
11
+ private cromulence;
12
+ /** A map from letter bitsets to words with that bitset. */
13
+ private bitsets;
14
+ /** The letter distribution of the wordlist. */
15
+ letters: LetterDistribution;
16
+ /** The prefix distribution of the wordlist. */
17
+ prefixes: PrefixDistribution;
18
+ /** The suffix distribution of the wordlist. */
19
+ suffixes: SuffixDistribution;
20
+ constructor(wordlist: Record<string, number>);
21
+ static download(): Promise<Wordlist>;
22
+ /**
23
+ * For testing purposes: create a wordlist from an array of words, each
24
+ * equiprobable.
25
+ */
26
+ static from(words: string[]): Wordlist;
27
+ /** Apply a reducer to each word in the wordlist. */
28
+ reduce<T>(initial: T, reducer: (acc: T, slug: string, zipf: number) => T): T;
29
+ /**
30
+ * Get the log prob that a wordlist item, drawn uniformly at random,
31
+ * satisfies the given property. This is NOT weighted by zipf!
32
+ */
33
+ logProb(property: (slug: string) => boolean): LogNum;
34
+ /** Returns true if the given slug is in the wordlist. */
35
+ isWord(slug: string, { threshold }?: {
36
+ threshold?: number;
37
+ }): boolean;
38
+ /** Returns true if any of the given slugs are in the wordlist. */
39
+ hasWord(slugs: string[], { threshold }?: {
40
+ threshold?: number;
41
+ }): boolean;
42
+ /** Filters for slugs in the wordlist, sorted from most common to least. */
43
+ filterWords(slugs: string[], { threshold }?: {
44
+ threshold?: number;
45
+ }): string[];
46
+ /**
47
+ * Filters for slugs in the wordlist under the given getter, sorted from most
48
+ * common to least.
49
+ */
50
+ filterWordsUnder<T>(items: T[], getSlug: (item: T) => string, { threshold }?: {
51
+ threshold?: number;
52
+ }): T[];
53
+ /** Returns true if the given phrase is in the wordlist. */
54
+ isPhrase(phrase: string): boolean;
55
+ /** Returns the anagrams of a given slug, sorted from most common to least. */
56
+ anagrams(slug: string, { loose, threshold, }?: {
57
+ loose?: boolean;
58
+ threshold?: number;
59
+ }): string[];
60
+ /**
61
+ * Prob that, for two words, the first has a suffix equal to the second's
62
+ * prefix, of the given length.
63
+ */
64
+ probSharedAffix(length: number): LogNum;
65
+ }
66
+ //# sourceMappingURL=wordlist.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"wordlist.d.ts","sourceRoot":"","sources":["../../src/lib/wordlist.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,kBAAkB,EAAE,kBAAkB,EAAE,MAAM,wBAAwB,CAAC;AAEhF,OAAO,EAAE,kBAAkB,EAAE,MAAM,yBAAyB,CAAC;AAC7D,OAAO,EAAE,MAAM,EAAE,MAAM,aAAa,CAAC;AAGrC;;;;;GAKG;AACH,qBAAa,QAAQ;IACnB,OAAO,CAAC,UAAU,CAAa;IAC/B,2DAA2D;IAC3D,OAAO,CAAC,OAAO,CAAgB;IAC/B,+CAA+C;IAC/C,OAAO,EAAE,kBAAkB,CAAC;IAC5B,+CAA+C;IAC/C,QAAQ,EAAE,kBAAkB,CAAC;IAC7B,+CAA+C;IAC/C,QAAQ,EAAE,kBAAkB,CAAC;gBAEjB,QAAQ,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC;WAQ/B,QAAQ,IAAI,OAAO,CAAC,QAAQ,CAAC;IAI1C;;;OAGG;IACH,MAAM,CAAC,IAAI,CAAC,KAAK,EAAE,MAAM,EAAE,GAAG,QAAQ;IAgBtC,oDAAoD;IACpD,MAAM,CAAC,CAAC,EAAE,OAAO,EAAE,CAAC,EAAE,OAAO,EAAE,CAAC,GAAG,EAAE,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,KAAK,CAAC,GAAG,CAAC;IAS5E;;;OAGG;IACH,OAAO,CAAC,QAAQ,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,OAAO,GAAG,MAAM;IAQpD,yDAAyD;IACzD,MAAM,CACJ,IAAI,EAAE,MAAM,EACZ,EAAE,SAAa,EAAE,GAAE;QAAE,SAAS,CAAC,EAAE,MAAM,CAAA;KAAO,GAC7C,OAAO;IAIV,kEAAkE;IAClE,OAAO,CACL,KAAK,EAAE,MAAM,EAAE,EACf,EAAE,SAAa,EAAE,GAAE;QAAE,SAAS,CAAC,EAAE,MAAM,CAAA;KAAO,GAC7C,OAAO;IAIV,2EAA2E;IAC3E,WAAW,CACT,KAAK,EAAE,MAAM,EAAE,EACf,EAAE,SAAa,EAAE,GAAE;QAAE,SAAS,CAAC,EAAE,MAAM,CAAA;KAAO,GAC7C,MAAM,EAAE;IAUX;;;OAGG;IACH,gBAAgB,CAAC,CAAC,EAChB,KAAK,EAAE,CAAC,EAAE,EACV,OAAO,EAAE,CAAC,IAAI,EAAE,CAAC,KAAK,MAAM,EAC5B,EAAE,SAAa,EAAE,GAAE;QAAE,SAAS,CAAC,EAAE,MAAM,CAAA;KAAO,GAC7C,CAAC,EAAE;IAQN,2DAA2D;IAC3D,QAAQ,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO;IAIjC,8EAA8E;IAC9E,QAAQ,CACN,IAAI,EAAE,MAAM,EACZ,EACE,KAAa,EACb,SAAa,GACd,GAAE;QAAE,KAAK,CAAC,EAAE,OAAO,CAAC;QAAC,SAAS,CAAC,EAAE,MAAM,CAAA;KAAO,GAC9C,MAAM,EAAE;IAUX;;;OAGG;IAEH,eAAe,CAAC,MAAM,EAAE,MAAM;CAU/B"}
@@ -0,0 +1,166 @@
1
+ var __runInitializers = (this && this.__runInitializers) || function (thisArg, initializers, value) {
2
+ var useValue = arguments.length > 2;
3
+ for (var i = 0; i < initializers.length; i++) {
4
+ value = useValue ? initializers[i].call(thisArg, value) : initializers[i].call(thisArg);
5
+ }
6
+ return useValue ? value : void 0;
7
+ };
8
+ var __esDecorate = (this && this.__esDecorate) || function (ctor, descriptorIn, decorators, contextIn, initializers, extraInitializers) {
9
+ function accept(f) { if (f !== void 0 && typeof f !== "function") throw new TypeError("Function expected"); return f; }
10
+ var kind = contextIn.kind, key = kind === "getter" ? "get" : kind === "setter" ? "set" : "value";
11
+ var target = !descriptorIn && ctor ? contextIn["static"] ? ctor : ctor.prototype : null;
12
+ var descriptor = descriptorIn || (target ? Object.getOwnPropertyDescriptor(target, contextIn.name) : {});
13
+ var _, done = false;
14
+ for (var i = decorators.length - 1; i >= 0; i--) {
15
+ var context = {};
16
+ for (var p in contextIn) context[p] = p === "access" ? {} : contextIn[p];
17
+ for (var p in contextIn.access) context.access[p] = contextIn.access[p];
18
+ context.addInitializer = function (f) { if (done) throw new TypeError("Cannot add initializers after decoration has completed"); extraInitializers.push(accept(f || null)); };
19
+ var result = (0, decorators[i])(kind === "accessor" ? { get: descriptor.get, set: descriptor.set } : descriptor[key], context);
20
+ if (kind === "accessor") {
21
+ if (result === void 0) continue;
22
+ if (result === null || typeof result !== "object") throw new TypeError("Object expected");
23
+ if (_ = accept(result.get)) descriptor.get = _;
24
+ if (_ = accept(result.set)) descriptor.set = _;
25
+ if (_ = accept(result.init)) initializers.unshift(_);
26
+ }
27
+ else if (_ = accept(result)) {
28
+ if (kind === "field") initializers.unshift(_);
29
+ else descriptor[key] = _;
30
+ }
31
+ }
32
+ if (target) Object.defineProperty(target, contextIn.name, descriptor);
33
+ done = true;
34
+ };
35
+ import { Cromulence, loadWordlist, logProbToZipf } from "cromulence";
36
+ import { PrefixDistribution, SuffixDistribution } from "./affixDistribution.js";
37
+ import { LetterBitsets } from "./letterBitset.js";
38
+ import { LetterDistribution } from "./letterDistribution.js";
39
+ import { LogNum } from "./logNum.js";
40
+ import { memoize } from "./memoize.js";
41
+ /**
42
+ * Info about the words in a wordlist.
43
+ *
44
+ * We assume (as in `cromulence`) that words appearing in puzzles are
45
+ * distributed via Zipf frequency.
46
+ */
47
+ let Wordlist = (() => {
48
+ let _instanceExtraInitializers = [];
49
+ let _probSharedAffix_decorators;
50
+ return class Wordlist {
51
+ static {
52
+ const _metadata = typeof Symbol === "function" && Symbol.metadata ? Object.create(null) : void 0;
53
+ _probSharedAffix_decorators = [memoize()];
54
+ __esDecorate(this, null, _probSharedAffix_decorators, { kind: "method", name: "probSharedAffix", static: false, private: false, access: { has: obj => "probSharedAffix" in obj, get: obj => obj.probSharedAffix }, metadata: _metadata }, null, _instanceExtraInitializers);
55
+ if (_metadata) Object.defineProperty(this, Symbol.metadata, { enumerable: true, configurable: true, writable: true, value: _metadata });
56
+ }
57
+ cromulence = __runInitializers(this, _instanceExtraInitializers);
58
+ /** A map from letter bitsets to words with that bitset. */
59
+ bitsets;
60
+ /** The letter distribution of the wordlist. */
61
+ letters;
62
+ /** The prefix distribution of the wordlist. */
63
+ prefixes;
64
+ /** The suffix distribution of the wordlist. */
65
+ suffixes;
66
+ constructor(wordlist) {
67
+ this.cromulence = new Cromulence(wordlist);
68
+ this.bitsets = new LetterBitsets(Object.keys(wordlist));
69
+ this.letters = new LetterDistribution(Object.keys(wordlist));
70
+ this.prefixes = new PrefixDistribution(Object.keys(wordlist));
71
+ this.suffixes = new SuffixDistribution(Object.keys(wordlist));
72
+ }
73
+ static async download() {
74
+ return new Wordlist(await loadWordlist());
75
+ }
76
+ /**
77
+ * For testing purposes: create a wordlist from an array of words, each
78
+ * equiprobable.
79
+ */
80
+ static from(words) {
81
+ const logFrac = LogNum.fromFraction(1, words.length);
82
+ const wordlist = {};
83
+ for (const word of words) {
84
+ wordlist[word] = wordlist[word] ? wordlist[word].add(logFrac) : logFrac;
85
+ }
86
+ return new Wordlist(Object.fromEntries(Object.entries(wordlist).map(([word, logProb]) => [
87
+ word,
88
+ logProbToZipf(logProb.toLog()),
89
+ ])));
90
+ }
91
+ /** Apply a reducer to each word in the wordlist. */
92
+ reduce(initial, reducer) {
93
+ let result = initial;
94
+ for (const slug in this.cromulence.wordlist) {
95
+ const zipf = this.cromulence.wordlist[slug];
96
+ result = reducer(result, slug, zipf);
97
+ }
98
+ return result;
99
+ }
100
+ /**
101
+ * Get the log prob that a wordlist item, drawn uniformly at random,
102
+ * satisfies the given property. This is NOT weighted by zipf!
103
+ */
104
+ logProb(property) {
105
+ // TODO: maybe tweak the weights here to get better results?
106
+ // if we do so, do the same thing in letterDistribution
107
+ const count = this.reduce(0, (acc, slug) => acc + (property(slug) ? 1 : 0));
108
+ const total = Object.keys(this.cromulence.wordlist).length;
109
+ return LogNum.fromFraction(count, total);
110
+ }
111
+ /** Returns true if the given slug is in the wordlist. */
112
+ isWord(slug, { threshold = 0 } = {}) {
113
+ return (this.cromulence.wordlist[slug] ?? -1000) > threshold;
114
+ }
115
+ /** Returns true if any of the given slugs are in the wordlist. */
116
+ hasWord(slugs, { threshold = 0 } = {}) {
117
+ return slugs.some((slug) => this.isWord(slug, { threshold }));
118
+ }
119
+ /** Filters for slugs in the wordlist, sorted from most common to least. */
120
+ filterWords(slugs, { threshold = 0 } = {}) {
121
+ return slugs
122
+ .map((slug) => [slug, this.cromulence.wordlist[slug]])
123
+ .filter((t) => t[1] !== undefined && t[1] > threshold)
124
+ .sort((a, b) => b[1] - a[1])
125
+ .map((t) => t[0]);
126
+ }
127
+ /**
128
+ * Filters for slugs in the wordlist under the given getter, sorted from most
129
+ * common to least.
130
+ */
131
+ filterWordsUnder(items, getSlug, { threshold = 0 } = {}) {
132
+ return items
133
+ .map((item) => [item, this.cromulence.wordlist[getSlug(item)]])
134
+ .filter((t) => t[1] !== undefined && t[1] > threshold)
135
+ .sort((a, b) => b[1] - a[1])
136
+ .map((t) => t[0]);
137
+ }
138
+ /** Returns true if the given phrase is in the wordlist. */
139
+ isPhrase(phrase) {
140
+ return this.cromulence.cromulence(phrase) > 0;
141
+ }
142
+ /** Returns the anagrams of a given slug, sorted from most common to least. */
143
+ anagrams(slug, { loose = false, threshold = 0, } = {}) {
144
+ return this.bitsets
145
+ .get(slug)
146
+ .filter((word) => loose || word !== slug)
147
+ .map((word) => [word, this.cromulence.wordlist[word]])
148
+ .filter((t) => t[1] > threshold)
149
+ .sort((a, b) => b[1] - a[1])
150
+ .map((t) => t[0]);
151
+ }
152
+ /**
153
+ * Prob that, for two words, the first has a suffix equal to the second's
154
+ * prefix, of the given length.
155
+ */
156
+ probSharedAffix(length) {
157
+ const prefixes = this.prefixes.get(length);
158
+ const suffixes = this.suffixes.get(length);
159
+ return LogNum.sum(Array.from(prefixes.entries(), ([prefix, prefixProb]) => {
160
+ return prefixProb.mul(suffixes.get(prefix));
161
+ }));
162
+ }
163
+ };
164
+ })();
165
+ export { Wordlist };
166
+ //# sourceMappingURL=wordlist.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"wordlist.js","sourceRoot":"","sources":["../../src/lib/wordlist.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,34 @@
1
+ import type { LinkOptions } from "../index.js";
2
+ import { LogNum } from "../lib/logNum.js";
3
+ import type { Wordlist } from "../lib/wordlist.js";
4
+ /**
5
+ * A PartialLink is the subset of Link that a Linker needs to return. We do
6
+ * some processing before it ends up being a Link. See Link for full details.
7
+ */
8
+ export type PartialLink = {
9
+ /** A human-readable link name; defaults to the name of the linker. */
10
+ name?: string;
11
+ /**
12
+ * Log prob we'd expect to see this link.
13
+ *
14
+ * Note that this should describe the log prob of the *name* of the link.
15
+ * A link with name "two distinct length values" should have the log prob
16
+ * that the words have *any two* distinct lengths, and the description
17
+ * should report more specifically what those lengths are.
18
+ */
19
+ logProb: LogNum;
20
+ /** Any extra info to include in the link. Can be blank. */
21
+ description: readonly string[];
22
+ };
23
+ /**
24
+ * A Linker is a function that takes a list of slugs and returns PartialLinks.
25
+ */
26
+ export type Linker = {
27
+ name: string;
28
+ eval: (slugs: string[], options: Required<LinkOptions>) => PartialLink[];
29
+ };
30
+ /** All linkers. */
31
+ export declare function allLinkers(wordlist: Wordlist): Linker[];
32
+ /** For testing purposes. */
33
+ export declare const testLinkOptions: Required<LinkOptions>;
34
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/linkers/index.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,aAAa,CAAC;AAE/C,OAAO,EAAE,MAAM,EAAE,MAAM,kBAAkB,CAAC;AAC1C,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,oBAAoB,CAAC;AAKnD;;;GAGG;AACH,MAAM,MAAM,WAAW,GAAG;IACxB,sEAAsE;IACtE,IAAI,CAAC,EAAE,MAAM,CAAC;IACd;;;;;;;OAOG;IACH,OAAO,EAAE,MAAM,CAAC;IAChB,2DAA2D;IAC3D,WAAW,EAAE,SAAS,MAAM,EAAE,CAAC;CAChC,CAAC;AAEF;;GAEG;AACH,MAAM,MAAM,MAAM,GAAG;IACnB,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,CAAC,KAAK,EAAE,MAAM,EAAE,EAAE,OAAO,EAAE,QAAQ,CAAC,WAAW,CAAC,KAAK,WAAW,EAAE,CAAC;CAC1E,CAAC;AAEF,mBAAmB;AACnB,wBAAgB,UAAU,CAAC,QAAQ,EAAE,QAAQ,GAAG,MAAM,EAAE,CAQvD;AAED,4BAA4B;AAC5B,eAAO,MAAM,eAAe,EAAE,QAAQ,CAAC,WAAW,CAKjD,CAAC"}
@@ -0,0 +1,25 @@
1
+ import { answerLengthLogProbs } from "../data/answerLengths.js";
2
+ import { featureLinkers } from "../features/index.js";
3
+ import { LengthDistribution } from "../lib/lengthDistribution.js";
4
+ import { LogNum } from "../lib/logNum.js";
5
+ import { indexingLinker } from "./indexing.js";
6
+ import { lengthLinker } from "./length.js";
7
+ import { otherLinker } from "./other.js";
8
+ /** All linkers. */
9
+ export function allLinkers(wordlist) {
10
+ const lengthDist = LengthDistribution.from(answerLengthLogProbs);
11
+ return [
12
+ ...featureLinkers(wordlist),
13
+ indexingLinker(wordlist),
14
+ lengthLinker(lengthDist),
15
+ otherLinker(wordlist),
16
+ ];
17
+ }
18
+ /** For testing purposes. */
19
+ export const testLinkOptions = {
20
+ lazy: false,
21
+ limit: Infinity,
22
+ minFeatureRatio: 0,
23
+ ordered: true,
24
+ };
25
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/linkers/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,oBAAoB,EAAE,MAAM,0BAA0B,CAAC;AAChE,OAAO,EAAE,cAAc,EAAE,MAAM,sBAAsB,CAAC;AAEtD,OAAO,EAAE,kBAAkB,EAAE,MAAM,8BAA8B,CAAC;AAClE,OAAO,EAAE,MAAM,EAAE,MAAM,kBAAkB,CAAC;AAE1C,OAAO,EAAE,cAAc,EAAE,MAAM,eAAe,CAAC;AAC/C,OAAO,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAC3C,OAAO,EAAE,WAAW,EAAE,MAAM,YAAY,CAAC;AA8BzC,mBAAmB;AACnB,MAAM,UAAU,UAAU,CAAC,QAAkB;IAC3C,MAAM,UAAU,GAAG,kBAAkB,CAAC,IAAI,CAAC,oBAAoB,CAAC,CAAC;IACjE,OAAO;QACL,GAAG,cAAc,CAAC,QAAQ,CAAC;QAC3B,cAAc,CAAC,QAAQ,CAAC;QACxB,YAAY,CAAC,UAAU,CAAC;QACxB,WAAW,CAAC,QAAQ,CAAC;KACtB,CAAC;AACJ,CAAC;AAED,4BAA4B;AAC5B,MAAM,CAAC,MAAM,eAAe,GAA0B;IACpD,IAAI,EAAE,KAAK;IACX,KAAK,EAAE,QAAQ;IACf,eAAe,EAAE,CAAC;IAClB,OAAO,EAAE,IAAI;CACd,CAAC"}
@@ -0,0 +1,5 @@
1
+ import type { Wordlist } from "../lib/wordlist.js";
2
+ import type { Linker } from "./index.js";
3
+ /** Links of the form "the nth indices are..." */
4
+ export declare function indexingLinker(wordlist: Wordlist): Linker;
5
+ //# sourceMappingURL=indexing.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"indexing.d.ts","sourceRoot":"","sources":["../../src/linkers/indexing.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,oBAAoB,CAAC;AACnD,OAAO,KAAK,EAAE,MAAM,EAAe,MAAM,YAAY,CAAC;AAqKtD,iDAAiD;AACjD,wBAAgB,cAAc,CAAC,QAAQ,EAAE,QAAQ,GAAG,MAAM,CAwBzD"}