@guillaume-docquier/tools-ts 8.6.1 → 9.0.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/README.md CHANGED
@@ -49,9 +49,10 @@ intervals.
49
49
 
50
50
  Use this tool when code needs shared ordering helpers.
51
51
 
52
- | Export | What it is | Use it when |
53
- | ------ | ---------------------------------------------- | --------------------------------------------------------------------------------------- |
54
- | `Sort` | Comparator helpers for common sort operations. | You want a shared sorting utility instead of rewriting compare callbacks at call sites. |
52
+ | Export | What it is | Use it when |
53
+ | ------------ | ------------------------------------------------------------------------------ | --------------------------------------------------------------------------------------- |
54
+ | `Sort` | Direction-aware numeric and property comparators, plus comparator composition. | You want a shared sorting utility instead of rewriting compare callbacks at call sites. |
55
+ | `Comparator` | Helper type to define comparators compatible with the Sort utilities. | You define sorting comparators. |
55
56
 
56
57
  ### Randomness
57
58
 
package/dist/Sort.d.ts CHANGED
@@ -1,18 +1,29 @@
1
- export declare const Sort: {
1
+ declare enum SortDirection {
2
+ /**
3
+ * From smallest to biggest.
4
+ */
5
+ Ascending = "Ascending",
2
6
  /**
3
- * Sorts numbers by ascending values
7
+ * From biggest to smallest.
4
8
  */
5
- byAscending: (a: number, b: number) => number;
9
+ Descending = "Descending"
10
+ }
11
+ export type Comparator<T> = (first: T, second: T) => number;
12
+ export declare const Sort: {
13
+ Direction: typeof SortDirection;
6
14
  /**
7
- * Sorts records by a numeric property in ascending order
15
+ * Composes comparators.
8
16
  */
9
- byAscendingProperty: <TProperty extends PropertyKey>(property: TProperty) => <TRecord extends Record<TProperty, number>>(a: TRecord, b: TRecord) => number;
17
+ compose: <T>(...comparators: ReadonlyArray<Comparator<T>>) => Comparator<T>;
10
18
  /**
11
- * Sorts numbers by ascending values
19
+ * Compares numbers in the selected direction.
20
+ * Defaults to Ascending.
12
21
  */
13
- byDescending: (a: number, b: number) => number;
22
+ numeric: (direction?: SortDirection) => Comparator<number>;
14
23
  /**
15
- * Sorts records by a numeric property in descending order
24
+ * Compares records by a numeric property in the selected direction.
25
+ * Defaults to Ascending.
16
26
  */
17
- byDescendingProperty: <TProperty extends PropertyKey>(property: TProperty) => <TRecord extends Record<TProperty, number>>(a: TRecord, b: TRecord) => number;
27
+ byNumericProperty: <TProperty extends PropertyKey>(property: TProperty, direction?: SortDirection) => <TRecord extends Record<TProperty, number>>(first: TRecord, second: TRecord) => number;
18
28
  };
29
+ export {};
package/dist/Sort.js CHANGED
@@ -1,27 +1,49 @@
1
- export const Sort = {
1
+ var SortDirection;
2
+ (function (SortDirection) {
2
3
  /**
3
- * Sorts numbers by ascending values
4
+ * From smallest to biggest.
4
5
  */
5
- byAscending: (a, b) => {
6
- return a - b;
7
- },
6
+ SortDirection["Ascending"] = "Ascending";
7
+ /**
8
+ * From biggest to smallest.
9
+ */
10
+ SortDirection["Descending"] = "Descending";
11
+ })(SortDirection || (SortDirection = {}));
12
+ export const Sort = {
13
+ Direction: SortDirection,
8
14
  /**
9
- * Sorts records by a numeric property in ascending order
15
+ * Composes comparators.
10
16
  */
11
- byAscendingProperty: (property) => (a, b) => {
12
- return Sort.byAscending(a[property], b[property]);
17
+ compose: (...comparators) => {
18
+ return (first, second) => {
19
+ for (const comparator of comparators) {
20
+ const comparison = comparator(first, second);
21
+ if (comparison !== 0) {
22
+ return comparison;
23
+ }
24
+ }
25
+ return 0;
26
+ };
13
27
  },
14
28
  /**
15
- * Sorts numbers by ascending values
29
+ * Compares numbers in the selected direction.
30
+ * Defaults to Ascending.
16
31
  */
17
- byDescending: (a, b) => {
18
- return b - a;
32
+ numeric: (direction = SortDirection.Ascending) => {
33
+ switch (direction) {
34
+ case SortDirection.Ascending:
35
+ return (first, second) => first - second;
36
+ case SortDirection.Descending:
37
+ return (first, second) => second - first;
38
+ }
19
39
  },
20
40
  /**
21
- * Sorts records by a numeric property in descending order
41
+ * Compares records by a numeric property in the selected direction.
42
+ * Defaults to Ascending.
22
43
  */
23
- byDescendingProperty: (property) => (a, b) => {
24
- return Sort.byDescending(a[property], b[property]);
44
+ byNumericProperty: (property, direction = SortDirection.Ascending) => {
45
+ const compare = Sort.numeric(direction);
46
+ return (first, second) => compare(first[property], second[property]);
25
47
  },
26
48
  };
27
49
  //# sourceMappingURL=Sort.js.map
package/dist/Sort.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"Sort.js","sourceRoot":"","sources":["../src/Sort.ts"],"names":[],"mappings":"AAAA,MAAM,CAAC,MAAM,IAAI,GAAG;IAClB;;OAEG;IACH,WAAW,EAAE,CAAC,CAAS,EAAE,CAAS,EAAU,EAAE;QAC5C,OAAO,CAAC,GAAG,CAAC,CAAA;IACd,CAAC;IAED;;OAEG;IACH,mBAAmB,EACjB,CAAgC,QAAmB,EAAE,EAAE,CACvD,CAA4C,CAAU,EAAE,CAAU,EAAU,EAAE;QAC5E,OAAO,IAAI,CAAC,WAAW,CAAC,CAAC,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAA;IACnD,CAAC;IAEH;;OAEG;IACH,YAAY,EAAE,CAAC,CAAS,EAAE,CAAS,EAAU,EAAE;QAC7C,OAAO,CAAC,GAAG,CAAC,CAAA;IACd,CAAC;IAED;;OAEG;IACH,oBAAoB,EAClB,CAAgC,QAAmB,EAAE,EAAE,CACvD,CAA4C,CAAU,EAAE,CAAU,EAAU,EAAE;QAC5E,OAAO,IAAI,CAAC,YAAY,CAAC,CAAC,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAA;IACpD,CAAC;CACJ,CAAA"}
1
+ {"version":3,"file":"Sort.js","sourceRoot":"","sources":["../src/Sort.ts"],"names":[],"mappings":"AAAA,IAAK,aAUJ;AAVD,WAAK,aAAa;IAChB;;OAEG;IACH,wCAAuB,CAAA;IAEvB;;OAEG;IACH,0CAAyB,CAAA;AAC3B,CAAC,EAVI,aAAa,KAAb,aAAa,QAUjB;AAID,MAAM,CAAC,MAAM,IAAI,GAAG;IAClB,SAAS,EAAE,aAAa;IAExB;;OAEG;IACH,OAAO,EAAE,CAAI,GAAG,WAAyC,EAAiB,EAAE;QAC1E,OAAO,CAAC,KAAK,EAAE,MAAM,EAAE,EAAE;YACvB,KAAK,MAAM,UAAU,IAAI,WAAW,EAAE,CAAC;gBACrC,MAAM,UAAU,GAAG,UAAU,CAAC,KAAK,EAAE,MAAM,CAAC,CAAA;gBAC5C,IAAI,UAAU,KAAK,CAAC,EAAE,CAAC;oBACrB,OAAO,UAAU,CAAA;gBACnB,CAAC;YACH,CAAC;YAED,OAAO,CAAC,CAAA;QACV,CAAC,CAAA;IACH,CAAC;IAED;;;OAGG;IACH,OAAO,EAAE,CAAC,SAAS,GAAkB,aAAa,CAAC,SAAS,EAAsB,EAAE;QAClF,QAAQ,SAAS,EAAE,CAAC;YAClB,KAAK,aAAa,CAAC,SAAS;gBAC1B,OAAO,CAAC,KAAK,EAAE,MAAM,EAAE,EAAE,CAAC,KAAK,GAAG,MAAM,CAAA;YAC1C,KAAK,aAAa,CAAC,UAAU;gBAC3B,OAAO,CAAC,KAAK,EAAE,MAAM,EAAE,EAAE,CAAC,MAAM,GAAG,KAAK,CAAA;QAC5C,CAAC;IACH,CAAC;IAED;;;OAGG;IACH,iBAAiB,EAAE,CAAgC,QAAmB,EAAE,SAAS,GAAkB,aAAa,CAAC,SAAS,EAAE,EAAE;QAC5H,MAAM,OAAO,GAAG,IAAI,CAAC,OAAO,CAAC,SAAS,CAAC,CAAA;QACvC,OAAO,CAA4C,KAAc,EAAE,MAAe,EAAU,EAAE,CAC5F,OAAO,CAAC,KAAK,CAAC,QAAQ,CAAC,EAAE,MAAM,CAAC,QAAQ,CAAC,CAAC,CAAA;IAC9C,CAAC;CACF,CAAA"}
@@ -25,7 +25,7 @@ export type { LogContext } from "./logging/log-context/LogContext.js";
25
25
  export type { LoggerContext } from "./logging/log-context/LoggerContext.js";
26
26
  export type { LogContextProvider } from "./logging/log-context/LogContextProvider.js";
27
27
  export { debounce } from "./debounce.js";
28
- export { Sort } from "./Sort.js";
28
+ export { Sort, type Comparator } from "./Sort.js";
29
29
  export { Rng, type RngState } from "./rng/Rng.js";
30
30
  export type { Generator } from "./rng/Generator.js";
31
31
  export { createGeneratorStub } from "./rng/Generator.stub.js";
@@ -1 +1 @@
1
- {"version":3,"file":"entry.tools-ts.js","sourceRoot":"","sources":["../src/entry.tools-ts.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,qBAAqB,CAAA;AAC7C,OAAO,EAAE,cAAc,EAAE,MAAM,4BAA4B,CAAA;AAC3D,OAAO,EAAE,UAAU,EAAE,MAAM,wBAAwB,CAAA;AACnD,OAAO,EAAE,mBAAmB,EAAE,MAAM,iCAAiC,CAAA;AACrE,OAAO,EAAE,aAAa,EAAE,MAAM,2BAA2B,CAAA;AACzD,OAAO,EAAE,UAAU,EAAE,MAAM,iBAAiB,CAAA;AAI5C,OAAO,EAAE,OAAO,EAAE,MAAM,cAAc,CAAA;AACtC,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAA;AAChC,OAAO,EAAE,MAAM,EAAE,MAAM,aAAa,CAAA;AACpC,OAAO,EAAE,MAAM,EAA8B,MAAM,aAAa,CAAA;AAChE,OAAO,EAAE,OAAO,EAAE,MAAM,cAAc,CAAA;AACtC,OAAO,EAAE,KAAK,EAAE,MAAM,YAAY,CAAA;AAClC,OAAO,EAAE,MAAM,EAAE,MAAM,aAAa,CAAA;AACpC,OAAO,EAAE,SAAS,EAAE,MAAM,gBAAgB,CAAA;AAC1C,OAAO,EAAE,eAAe,EAAE,MAAM,sBAAsB,CAAA;AACtD,OAAO,EAAE,IAAI,EAAE,SAAS,EAAE,MAAM,WAAW,CAAA;AAE3C,OAAO,EAAE,MAAM,EAAE,MAAM,qBAAqB,CAAA;AAC5C,OAAO,EAAE,yBAAyB,EAAE,MAAM,wBAAwB,CAAA;AAClE,OAAO,EAAE,iBAAiB,EAAE,MAAM,0CAA0C,CAAA;AAC5E,OAAO,EAAE,sBAAsB,EAAE,MAAM,+CAA+C,CAAA;AAEtF,OAAO,EAAE,oBAAoB,EAAE,MAAM,kCAAkC,CAAA;AAKvE,OAAO,EAAE,QAAQ,EAAE,MAAM,eAAe,CAAA;AACxC,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAA;AAChC,OAAO,EAAE,GAAG,EAAiB,MAAM,cAAc,CAAA;AAEjD,OAAO,EAAE,mBAAmB,EAAE,MAAM,yBAAyB,CAAA;AAC7D,OAAO,EAAE,cAAc,EAAE,MAAM,yBAAyB,CAAA;AACxD,OAAO,EAAE,QAAQ,EAAE,MAAM,eAAe,CAAA;AACxC,OAAO,EAAE,KAAK,EAAE,WAAW,EAAE,MAAM,yBAAyB,CAAA;AAC5D,OAAO,EAAE,IAAI,EAAE,UAAU,EAAE,MAAM,wBAAwB,CAAA;AACzD,OAAO,EAAE,QAAQ,EAAE,cAAc,EAAE,MAAM,4BAA4B,CAAA;AACrE,OAAO,EAAE,OAAO,EAAW,MAAM,2BAA2B,CAAA;AAC5D,OAAO,EAAE,OAAO,EAAY,MAAM,2BAA2B,CAAA;AAC7D,OAAO,EAAE,KAAK,EAAE,MAAM,YAAY,CAAA;AAClC,OAAO,EAAgB,OAAO,EAAgE,MAAM,YAAY,CAAA;AAChH,OAAO,EAAE,OAAO,EAAE,MAAM,cAAc,CAAA"}
1
+ {"version":3,"file":"entry.tools-ts.js","sourceRoot":"","sources":["../src/entry.tools-ts.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,qBAAqB,CAAA;AAC7C,OAAO,EAAE,cAAc,EAAE,MAAM,4BAA4B,CAAA;AAC3D,OAAO,EAAE,UAAU,EAAE,MAAM,wBAAwB,CAAA;AACnD,OAAO,EAAE,mBAAmB,EAAE,MAAM,iCAAiC,CAAA;AACrE,OAAO,EAAE,aAAa,EAAE,MAAM,2BAA2B,CAAA;AACzD,OAAO,EAAE,UAAU,EAAE,MAAM,iBAAiB,CAAA;AAI5C,OAAO,EAAE,OAAO,EAAE,MAAM,cAAc,CAAA;AACtC,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAA;AAChC,OAAO,EAAE,MAAM,EAAE,MAAM,aAAa,CAAA;AACpC,OAAO,EAAE,MAAM,EAA8B,MAAM,aAAa,CAAA;AAChE,OAAO,EAAE,OAAO,EAAE,MAAM,cAAc,CAAA;AACtC,OAAO,EAAE,KAAK,EAAE,MAAM,YAAY,CAAA;AAClC,OAAO,EAAE,MAAM,EAAE,MAAM,aAAa,CAAA;AACpC,OAAO,EAAE,SAAS,EAAE,MAAM,gBAAgB,CAAA;AAC1C,OAAO,EAAE,eAAe,EAAE,MAAM,sBAAsB,CAAA;AACtD,OAAO,EAAE,IAAI,EAAE,SAAS,EAAE,MAAM,WAAW,CAAA;AAE3C,OAAO,EAAE,MAAM,EAAE,MAAM,qBAAqB,CAAA;AAC5C,OAAO,EAAE,yBAAyB,EAAE,MAAM,wBAAwB,CAAA;AAClE,OAAO,EAAE,iBAAiB,EAAE,MAAM,0CAA0C,CAAA;AAC5E,OAAO,EAAE,sBAAsB,EAAE,MAAM,+CAA+C,CAAA;AAEtF,OAAO,EAAE,oBAAoB,EAAE,MAAM,kCAAkC,CAAA;AAKvE,OAAO,EAAE,QAAQ,EAAE,MAAM,eAAe,CAAA;AACxC,OAAO,EAAE,IAAI,EAAmB,MAAM,WAAW,CAAA;AACjD,OAAO,EAAE,GAAG,EAAiB,MAAM,cAAc,CAAA;AAEjD,OAAO,EAAE,mBAAmB,EAAE,MAAM,yBAAyB,CAAA;AAC7D,OAAO,EAAE,cAAc,EAAE,MAAM,yBAAyB,CAAA;AACxD,OAAO,EAAE,QAAQ,EAAE,MAAM,eAAe,CAAA;AACxC,OAAO,EAAE,KAAK,EAAE,WAAW,EAAE,MAAM,yBAAyB,CAAA;AAC5D,OAAO,EAAE,IAAI,EAAE,UAAU,EAAE,MAAM,wBAAwB,CAAA;AACzD,OAAO,EAAE,QAAQ,EAAE,cAAc,EAAE,MAAM,4BAA4B,CAAA;AACrE,OAAO,EAAE,OAAO,EAAW,MAAM,2BAA2B,CAAA;AAC5D,OAAO,EAAE,OAAO,EAAY,MAAM,2BAA2B,CAAA;AAC7D,OAAO,EAAE,KAAK,EAAE,MAAM,YAAY,CAAA;AAClC,OAAO,EAAgB,OAAO,EAAgE,MAAM,YAAY,CAAA;AAChH,OAAO,EAAE,OAAO,EAAE,MAAM,cAAc,CAAA"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@guillaume-docquier/tools-ts",
3
- "version": "8.6.1",
3
+ "version": "9.0.0",
4
4
  "description": "My personal collection of typescript tools",
5
5
  "homepage": "https://github.com/Guillaume-Docquier/tools-ts",
6
6
  "license": "MIT",