@thisisagile/easy 17.4.5 → 17.4.7

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.
@@ -0,0 +1,26 @@
1
+ import {
2
+ toList
3
+ } from "./chunk-EX7OK25Y.mjs";
4
+ import {
5
+ ifTrue
6
+ } from "./chunk-JSON7A4X.mjs";
7
+
8
+ // src/utils/Seconds.ts
9
+ var seconds = {
10
+ toDuration: (s) => {
11
+ const seconds2 = s % 60;
12
+ const minutes = Math.floor(s / 60) % 60;
13
+ const hours = Math.floor(s / 3600) % 24;
14
+ const days = Math.floor(s / 86400);
15
+ return { days, hours, minutes, seconds: seconds2 };
16
+ },
17
+ toText: (s) => {
18
+ const { days, hours, minutes, seconds: secs } = seconds.toDuration(s);
19
+ return toList(ifTrue(days, `${days}d`), ifTrue(hours, `${hours}h`), ifTrue(minutes, `${minutes}m`), ifTrue(days + hours + minutes === 0, `${secs}s`)).mapDefined((s2) => s2).join(" ");
20
+ }
21
+ };
22
+
23
+ export {
24
+ seconds
25
+ };
26
+ //# sourceMappingURL=chunk-4NI3O7DE.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/utils/Seconds.ts"],"sourcesContent":["import { ifTrue } from './If';\nimport { toList } from '../types/List';\n\nexport const seconds = {\n toDuration: (s: number) => {\n const seconds = s % 60;\n const minutes = Math.floor(s / 60) % 60;\n const hours = Math.floor(s / 3600) % 24;\n const days = Math.floor(s / 86400);\n return { days, hours, minutes, seconds };\n },\n\n toText: (s: number): string => {\n const { days, hours, minutes, seconds: secs } = seconds.toDuration(s);\n return toList(ifTrue(days, `${days}d`), ifTrue(hours, `${hours}h`), ifTrue(minutes, `${minutes}m`), ifTrue(days + hours + minutes === 0, `${secs}s`))\n .mapDefined(s => s)\n .join(' ');\n },\n};\n"],"mappings":";;;;;;;;AAGO,IAAM,UAAU;AAAA,EACrB,YAAY,CAAC,MAAc;AACzB,UAAMA,WAAU,IAAI;AACpB,UAAM,UAAU,KAAK,MAAM,IAAI,EAAE,IAAI;AACrC,UAAM,QAAQ,KAAK,MAAM,IAAI,IAAI,IAAI;AACrC,UAAM,OAAO,KAAK,MAAM,IAAI,KAAK;AACjC,WAAO,EAAE,MAAM,OAAO,SAAS,SAAAA,SAAQ;AAAA,EACzC;AAAA,EAEA,QAAQ,CAAC,MAAsB;AAC7B,UAAM,EAAE,MAAM,OAAO,SAAS,SAAS,KAAK,IAAI,QAAQ,WAAW,CAAC;AACpE,WAAO,OAAO,OAAO,MAAM,GAAG,IAAI,GAAG,GAAG,OAAO,OAAO,GAAG,KAAK,GAAG,GAAG,OAAO,SAAS,GAAG,OAAO,GAAG,GAAG,OAAO,OAAO,QAAQ,YAAY,GAAG,GAAG,IAAI,GAAG,CAAC,EACjJ,WAAW,CAAAC,OAAKA,EAAC,EACjB,KAAK,GAAG;AAAA,EACb;AACF;","names":["seconds","s"]}
@@ -0,0 +1,29 @@
1
+ // src/utils/Traverse.ts
2
+ var traverse = (subject = {}, property = "") => {
3
+ const props = property.split(".");
4
+ const p = props.shift();
5
+ return props.length === 0 ? subject[p] : traverse(subject[p], props.join("."));
6
+ };
7
+ var traverseSet = (subject, property, value) => {
8
+ const props = property.split(".");
9
+ const p = props.shift();
10
+ return {
11
+ ...subject,
12
+ [p]: props.length === 0 ? value : traverseSet(subject[p], props.join("."), value)
13
+ };
14
+ };
15
+ var accumulate = (items, ...keys) => items.map((t, i, arr) => {
16
+ const acc = keys.reduce(
17
+ (acc2, v) => traverseSet(acc2, v, i === 0 ? traverse(t, v) : traverse(arr[i - 1], v) + traverse(t, v)),
18
+ t
19
+ );
20
+ arr[i] = acc;
21
+ return acc;
22
+ });
23
+
24
+ export {
25
+ traverse,
26
+ traverseSet,
27
+ accumulate
28
+ };
29
+ //# sourceMappingURL=chunk-BKA7GVXL.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/utils/Traverse.ts"],"sourcesContent":["import { AnyKey } from '../types/AnyKey';\n\nexport const traverse = (subject: unknown = {}, property = ''): unknown => {\n const props = property.split('.');\n const p = props.shift() as string;\n return props.length === 0 ? (subject as any)[p] : traverse((subject as any)[p], props.join('.'));\n};\n\nexport const traverseSet = <T>(subject: T, property: AnyKey<T>, value: unknown): unknown => {\n const props = property.split('.');\n const p = props.shift() as string;\n return {\n ...(subject as any),\n [p]: props.length === 0 ? value : traverseSet((subject as any)[p], props.join('.'), value),\n } as T;\n};\n\nexport const accumulate = <T>(items: T[], ...keys: AnyKey<T>[]): T[] =>\n items.map((t, i, arr) => {\n const acc = keys.reduce(\n (acc, v) => traverseSet(acc, v, i === 0 ? traverse(t, v) : (traverse(arr[i - 1], v) as number) + (traverse(t, v) as number)) as T,\n t\n );\n arr[i] = acc;\n return acc;\n });\n"],"mappings":";AAEO,IAAM,WAAW,CAAC,UAAmB,CAAC,GAAG,WAAW,OAAgB;AACzE,QAAM,QAAQ,SAAS,MAAM,GAAG;AAChC,QAAM,IAAI,MAAM,MAAM;AACtB,SAAO,MAAM,WAAW,IAAK,QAAgB,CAAC,IAAI,SAAU,QAAgB,CAAC,GAAG,MAAM,KAAK,GAAG,CAAC;AACjG;AAEO,IAAM,cAAc,CAAI,SAAY,UAAqB,UAA4B;AAC1F,QAAM,QAAQ,SAAS,MAAM,GAAG;AAChC,QAAM,IAAI,MAAM,MAAM;AACtB,SAAO;AAAA,IACL,GAAI;AAAA,IACJ,CAAC,CAAC,GAAG,MAAM,WAAW,IAAI,QAAQ,YAAa,QAAgB,CAAC,GAAG,MAAM,KAAK,GAAG,GAAG,KAAK;AAAA,EAC3F;AACF;AAEO,IAAM,aAAa,CAAI,UAAe,SAC3C,MAAM,IAAI,CAAC,GAAG,GAAG,QAAQ;AACvB,QAAM,MAAM,KAAK;AAAA,IACf,CAACA,MAAK,MAAM,YAAYA,MAAK,GAAG,MAAM,IAAI,SAAS,GAAG,CAAC,IAAK,SAAS,IAAI,IAAI,CAAC,GAAG,CAAC,IAAgB,SAAS,GAAG,CAAC,CAAY;AAAA,IAC3H;AAAA,EACF;AACA,MAAI,CAAC,IAAI;AACT,SAAO;AACT,CAAC;","names":["acc"]}
@@ -1,6 +1,6 @@
1
1
  import {
2
2
  traverse
3
- } from "./chunk-DICMUQFL.mjs";
3
+ } from "./chunk-BKA7GVXL.mjs";
4
4
  import {
5
5
  isEqual
6
6
  } from "./chunk-T5VZORPQ.mjs";
@@ -88,4 +88,4 @@ export {
88
88
  view,
89
89
  views
90
90
  };
91
- //# sourceMappingURL=chunk-24OSK3DS.mjs.map
91
+ //# sourceMappingURL=chunk-O7SPVDR7.mjs.map
@@ -7,7 +7,7 @@ import {
7
7
  } from "./chunk-WI2ICJHX.mjs";
8
8
  import {
9
9
  DateTime
10
- } from "./chunk-5M76X6J5.mjs";
10
+ } from "./chunk-VZ4Q5DDN.mjs";
11
11
  import {
12
12
  choose
13
13
  } from "./chunk-QLM2AYD4.mjs";
@@ -47,4 +47,4 @@ __decorateClass([
47
47
  export {
48
48
  Audit
49
49
  };
50
- //# sourceMappingURL=chunk-WBEMXVO6.mjs.map
50
+ //# sourceMappingURL=chunk-TJXM2374.mjs.map
@@ -1,3 +1,6 @@
1
+ import {
2
+ seconds
3
+ } from "./chunk-4NI3O7DE.mjs";
1
4
  import {
2
5
  isDate
3
6
  } from "./chunk-ADJAEGCT.mjs";
@@ -103,6 +106,9 @@ var DateTime = class _DateTime extends Value {
103
106
  toDate() {
104
107
  return this.isValid ? this.utc.toJSDate() : void 0;
105
108
  }
109
+ ago(end = _DateTime.now) {
110
+ return seconds.toText(end.diff(this, "second"));
111
+ }
106
112
  };
107
113
  var isDateTime = (dt2) => isDefined(dt2) && dt2 instanceof DateTime;
108
114
  var dt = (dt2) => isString(dt2) || isNumber(dt2) || dt2 instanceof Date ? new DateTime(dt2) : new DateTime();
@@ -112,4 +118,4 @@ export {
112
118
  isDateTime,
113
119
  dt
114
120
  };
115
- //# sourceMappingURL=chunk-5M76X6J5.mjs.map
121
+ //# sourceMappingURL=chunk-VZ4Q5DDN.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/domain/DateTime.ts"],"sourcesContent":["import { DateTime as LuxonDateTime, DateTimeUnit as LuxonDateTimeUnit, DurationUnit as LuxonDurationUnit, Settings } from 'luxon';\nimport { Value } from '../types/Value';\nimport { Optional } from '../types/Types';\nimport { choose } from '../types/Case';\nimport { isDefined, isNumber, isString } from '../types/Is';\nimport { isDate } from '../types/IsDate';\nimport { isA } from '../types/IsA';\nimport { ifDefined } from '../utils/If';\nimport { JsonValue } from '../types/Json';\nimport { seconds } from '../utils/Seconds';\n\nSettings.defaultZone = 'utc';\n\nexport type DateTimeUnit = LuxonDateTimeUnit;\nexport type DurationUnit = LuxonDurationUnit;\nexport type Duration = Partial<Record<DurationUnit, number>>;\n\nexport type DiffOptions = {\n rounding: 'floor' | 'ceil' | 'round';\n};\n\nexport class DateTime extends Value<Optional<string>> {\n constructor(value?: string | number | Date | DateTime | null, format?: string) {\n super(\n choose(value)\n .type(isString, v => (format ? LuxonDateTime.fromFormat(v, format, { setZone: true }) : LuxonDateTime.fromISO(v, { setZone: true })))\n .type(isNumber, v => LuxonDateTime.fromMillis(v))\n .type(isDate, v => LuxonDateTime.fromJSDate(v))\n .type(isDateTime, v => LuxonDateTime.fromISO(v.toString()))\n .else(undefined as unknown as LuxonDateTime)\n ?.toISO() as unknown as string\n );\n }\n\n static get now(): DateTime {\n return new DateTime(LuxonDateTime.utc().toISO());\n }\n\n get isValid(): boolean {\n return isDefined(this.value) && this.utc.isValid;\n }\n\n /**\n * @deprecated Deprecated in favor for DateTime.from as that also accepts locales and another DateTime\n */\n get fromNow(): string {\n return this.from();\n }\n\n protected get utc(): LuxonDateTime {\n return this.luxon.setZone('utc');\n }\n\n protected get luxon(): LuxonDateTime {\n return LuxonDateTime.fromISO(this.value as string, { setZone: true });\n }\n\n from(date?: DateTime): string;\n\n from(locale?: string): string;\n\n from(date?: DateTime, locale?: string): string;\n\n from(param?: string | DateTime, other?: string): string {\n const date: Optional<DateTime> = isA<DateTime>(param) ? param : undefined;\n const locale: string = (isString(param) ? param : undefined) ?? other ?? 'en';\n return ifDefined(\n date,\n d => this.utc.setLocale(locale).toRelative({ base: d.utc }),\n () => this.utc.setLocale(locale).toRelative()\n ) as string;\n }\n\n isAfter(dt: DateTime): boolean {\n return this.utc > dt.utc;\n }\n\n isBefore(dt: DateTime): boolean {\n return this.utc < dt.utc;\n }\n\n equals(dt: DateTime): boolean {\n return this.utc.hasSame(dt.utc, 'millisecond');\n }\n\n add(n: number): DateTime;\n add(n: number, unit: DurationUnit): DateTime;\n add(duration: Duration): DateTime;\n add(n: number | Duration, unit?: DurationUnit): DateTime {\n return new DateTime(this.luxon.plus(isNumber(n) ? { [unit ?? ('day' as string)]: n } : n).toISO());\n }\n\n subtract(n: number): DateTime;\n subtract(n: number, unit: DurationUnit): DateTime;\n subtract(duration: Duration): DateTime;\n subtract(n: number | Duration, unit?: DurationUnit): DateTime {\n return new DateTime(this.luxon.minus(isNumber(n) ? { [unit ?? ('day' as string)]: n } : n).toISO());\n }\n\n diff(other: DateTime, unit: DateTimeUnit = 'day', opts?: DiffOptions): number {\n return Math[opts?.rounding ?? 'floor'](this.utc.diff(other.utc).as(unit));\n }\n\n startOf(unit: DateTimeUnit = 'day'): DateTime {\n return new DateTime(this.luxon.startOf(unit).toISO());\n }\n\n endOf(unit: DateTimeUnit = 'day'): DateTime {\n return new DateTime(this.luxon.endOf(unit).toISO());\n }\n\n isWeekend(): boolean {\n return this.luxon.isWeekend;\n }\n\n withZone(zone: string): DateTime {\n return new DateTime(this.utc.setZone(zone).toISO());\n }\n\n toString(): string {\n return this.value ?? '';\n }\n\n toJSON(): JsonValue {\n return this.utc.toISO() as unknown as JsonValue;\n }\n\n toFormat(format: string): string {\n return this.luxon.toFormat(format);\n }\n\n toLocale(locale = 'nl-NL', format = 'D'): string {\n return this.luxon.setLocale(locale).toFormat(format);\n }\n\n toFull(locale?: string): string {\n return this.toLocale(locale, 'DDD');\n }\n\n toDate(): Optional<Date> {\n return this.isValid ? this.utc.toJSDate() : undefined;\n }\n\n ago(end: DateTime = DateTime.now): string {\n return seconds.toText(end.diff(this, 'second'));\n }\n}\n\nexport const isDateTime = (dt?: unknown): dt is DateTime => isDefined(dt) && dt instanceof DateTime;\n\nexport const dt = (dt?: unknown): DateTime => (isString(dt) || isNumber(dt) || dt instanceof Date ? new DateTime(dt) : new DateTime());\n"],"mappings":"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","names":["dt"]}
@@ -1,9 +1,10 @@
1
1
  import {
2
2
  Audit
3
- } from "../chunk-WBEMXVO6.mjs";
3
+ } from "../chunk-TJXM2374.mjs";
4
4
  import "../chunk-INO2742F.mjs";
5
5
  import "../chunk-WI2ICJHX.mjs";
6
- import "../chunk-5M76X6J5.mjs";
6
+ import "../chunk-VZ4Q5DDN.mjs";
7
+ import "../chunk-4NI3O7DE.mjs";
7
8
  import "../chunk-ADJAEGCT.mjs";
8
9
  import "../chunk-JCINHOMG.mjs";
9
10
  import "../chunk-QLM2AYD4.mjs";
@@ -38,6 +38,7 @@ export declare class DateTime extends Value<Optional<string>> {
38
38
  toLocale(locale?: string, format?: string): string;
39
39
  toFull(locale?: string): string;
40
40
  toDate(): Optional<Date>;
41
+ ago(end?: DateTime): string;
41
42
  }
42
43
  export declare const isDateTime: (dt?: unknown) => dt is DateTime;
43
44
  export declare const dt: (dt?: unknown) => DateTime;
@@ -2,7 +2,8 @@ import {
2
2
  DateTime,
3
3
  dt,
4
4
  isDateTime
5
- } from "../chunk-5M76X6J5.mjs";
5
+ } from "../chunk-VZ4Q5DDN.mjs";
6
+ import "../chunk-4NI3O7DE.mjs";
6
7
  import "../chunk-ADJAEGCT.mjs";
7
8
  import "../chunk-QLM2AYD4.mjs";
8
9
  import "../chunk-OFGI5FLG.mjs";
@@ -1,6 +1,6 @@
1
1
  import {
2
2
  Audit
3
- } from "../chunk-WBEMXVO6.mjs";
3
+ } from "../chunk-TJXM2374.mjs";
4
4
  import {
5
5
  toId
6
6
  } from "../chunk-5YM5CLOG.mjs";
@@ -10,7 +10,8 @@ import {
10
10
  import {
11
11
  Struct
12
12
  } from "../chunk-WI2ICJHX.mjs";
13
- import "../chunk-5M76X6J5.mjs";
13
+ import "../chunk-VZ4Q5DDN.mjs";
14
+ import "../chunk-4NI3O7DE.mjs";
14
15
  import "../chunk-ADJAEGCT.mjs";
15
16
  import "../chunk-LXQQ5N6S.mjs";
16
17
  import {
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/domain/Entity.ts"],"sourcesContent":["import { Struct } from './Struct';\nimport { Audit } from './Audit';\nimport { required } from '../validation/Contraints';\nimport { Id, toId } from '../types/Id';\nimport { json, Json } from '../types/Json';\n\nexport abstract class Entity extends Struct {\n @required() readonly id: Id = this.state.id ?? toId();\n @required() readonly created: Audit = new Audit(this.state.created);\n @required() readonly lastModified: Audit = new Audit(this.state.lastModified);\n\n protected merge(a: unknown): Json {\n return json.merge(this, a, {\n id: this.id,\n created: this.created,\n lastModified: new Audit(),\n });\n }\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAMO,IAAe,SAAf,cAA8B,OAAO;AAAA,EACrB,KAAS,KAAK,MAAM,MAAM,KAAK;AAAA,EAC/B,UAAiB,IAAI,MAAM,KAAK,MAAM,OAAO;AAAA,EAC7C,eAAsB,IAAI,MAAM,KAAK,MAAM,YAAY;AAAA,EAElE,MAAM,GAAkB;AAChC,WAAO,KAAK,MAAM,MAAM,GAAG;AAAA,MACzB,IAAI,KAAK;AAAA,MACT,SAAS,KAAK;AAAA,MACd,cAAc,IAAI,MAAM;AAAA,IAC1B,CAAC;AAAA,EACH;AACF;AAXuB;AAAA,EAApB,SAAS;AAAA,GADU,OACC;AACA;AAAA,EAApB,SAAS;AAAA,GAFU,OAEC;AACA;AAAA,EAApB,SAAS;AAAA,GAHU,OAGC;","names":[]}
1
+ {"version":3,"sources":["../../src/domain/Entity.ts"],"sourcesContent":["import { Struct } from './Struct';\nimport { Audit } from './Audit';\nimport { required } from '../validation/Contraints';\nimport { Id, toId } from '../types/Id';\nimport { json, Json } from '../types/Json';\n\nexport abstract class Entity extends Struct {\n @required() readonly id: Id = this.state.id ?? toId();\n @required() readonly created: Audit = new Audit(this.state.created);\n @required() readonly lastModified: Audit = new Audit(this.state.lastModified);\n\n protected merge(a: unknown): Json {\n return json.merge(this, a, {\n id: this.id,\n created: this.created,\n lastModified: new Audit(),\n });\n }\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAMO,IAAe,SAAf,cAA8B,OAAO;AAAA,EACrB,KAAS,KAAK,MAAM,MAAM,KAAK;AAAA,EAC/B,UAAiB,IAAI,MAAM,KAAK,MAAM,OAAO;AAAA,EAC7C,eAAsB,IAAI,MAAM,KAAK,MAAM,YAAY;AAAA,EAElE,MAAM,GAAkB;AAChC,WAAO,KAAK,MAAM,MAAM,GAAG;AAAA,MACzB,IAAI,KAAK;AAAA,MACT,SAAS,KAAK;AAAA,MACd,cAAc,IAAI,MAAM;AAAA,IAC1B,CAAC;AAAA,EACH;AACF;AAXuB;AAAA,EAApB,SAAS;AAAA,GADU,OACC;AACA;AAAA,EAApB,SAAS;AAAA,GAFU,OAEC;AACA;AAAA,EAApB,SAAS;AAAA,GAHU,OAGC;","names":[]}
package/dist/index.js CHANGED
@@ -111,6 +111,7 @@ __export(src_exports, {
111
111
  ViewRouteGateway: () => ViewRouteGateway,
112
112
  Wait: () => Wait,
113
113
  When: () => When,
114
+ accumulate: () => accumulate,
114
115
  any: () => any,
115
116
  api: () => api,
116
117
  array: () => array,
@@ -261,6 +262,7 @@ __export(src_exports, {
261
262
  toViewer: () => toViewer,
262
263
  toWords: () => toWords,
263
264
  traverse: () => traverse,
265
+ traverseSet: () => traverseSet,
264
266
  tryTo: () => tryTo,
265
267
  tuple: () => tuple,
266
268
  tuple2: () => tuple2,
@@ -1601,6 +1603,21 @@ var days = {
1601
1603
  var inPast = (o) => isDate(o) && o <= days.today();
1602
1604
  var inFuture = (o) => isDate(o) && o > days.today();
1603
1605
 
1606
+ // src/utils/Seconds.ts
1607
+ var seconds = {
1608
+ toDuration: (s) => {
1609
+ const seconds2 = s % 60;
1610
+ const minutes = Math.floor(s / 60) % 60;
1611
+ const hours = Math.floor(s / 3600) % 24;
1612
+ const days2 = Math.floor(s / 86400);
1613
+ return { days: days2, hours, minutes, seconds: seconds2 };
1614
+ },
1615
+ toText: (s) => {
1616
+ const { days: days2, hours, minutes, seconds: secs } = seconds.toDuration(s);
1617
+ return toList(ifTrue(days2, `${days2}d`), ifTrue(hours, `${hours}h`), ifTrue(minutes, `${minutes}m`), ifTrue(days2 + hours + minutes === 0, `${secs}s`)).mapDefined((s2) => s2).join(" ");
1618
+ }
1619
+ };
1620
+
1604
1621
  // src/domain/DateTime.ts
1605
1622
  import_luxon.Settings.defaultZone = "utc";
1606
1623
  var DateTime = class _DateTime extends Value {
@@ -1684,6 +1701,9 @@ var DateTime = class _DateTime extends Value {
1684
1701
  toDate() {
1685
1702
  return this.isValid ? this.utc.toJSDate() : void 0;
1686
1703
  }
1704
+ ago(end = _DateTime.now) {
1705
+ return seconds.toText(end.diff(this, "second"));
1706
+ }
1687
1707
  };
1688
1708
  var isDateTime = (dt2) => isDefined(dt2) && dt2 instanceof DateTime;
1689
1709
  var dt = (dt2) => isString(dt2) || isNumber(dt2) || dt2 instanceof Date ? new DateTime(dt2) : new DateTime();
@@ -2668,6 +2688,22 @@ var traverse = (subject = {}, property = "") => {
2668
2688
  const p = props.shift();
2669
2689
  return props.length === 0 ? subject[p] : traverse(subject[p], props.join("."));
2670
2690
  };
2691
+ var traverseSet = (subject, property, value) => {
2692
+ const props = property.split(".");
2693
+ const p = props.shift();
2694
+ return {
2695
+ ...subject,
2696
+ [p]: props.length === 0 ? value : traverseSet(subject[p], props.join("."), value)
2697
+ };
2698
+ };
2699
+ var accumulate = (items, ...keys) => items.map((t, i, arr) => {
2700
+ const acc = keys.reduce(
2701
+ (acc2, v) => traverseSet(acc2, v, i === 0 ? traverse(t, v) : traverse(arr[i - 1], v) + traverse(t, v)),
2702
+ t
2703
+ );
2704
+ arr[i] = acc;
2705
+ return acc;
2706
+ });
2671
2707
 
2672
2708
  // src/types/IsEqual.ts
2673
2709
  var isEqualArray = (one, another) => choose([one, another]).case(([o, a]) => !isArray(o) || !isArray(a), false).case(([o, a]) => o?.length !== a?.length, false).else(([o, a]) => !o.some((v, i) => !isEqual(v, a[i])));
@@ -3195,26 +3231,6 @@ function dir(t) {
3195
3231
  return t;
3196
3232
  }
3197
3233
 
3198
- // src/utils/Seconds.ts
3199
- var seconds = {
3200
- toDuration: (s) => {
3201
- const seconds2 = s % 60;
3202
- const minutes = Math.floor(s / 60) % 60;
3203
- const hours = Math.floor(s / 3600) % 24;
3204
- const days2 = Math.floor(s / 86400);
3205
- return { days: days2, hours, minutes, seconds: seconds2 };
3206
- },
3207
- toText: (s) => {
3208
- const { days: days2, hours, minutes, seconds: secs } = seconds.toDuration(s);
3209
- return toList(
3210
- ifTrue(days2, (d) => `${d}d`),
3211
- ifTrue(hours, (h) => `${h}h`),
3212
- ifTrue(minutes, (m) => `${m}m`),
3213
- ifTrue(days2 + hours + minutes === 0, `${secs}s`)
3214
- ).mapDefined((s2) => s2).join(" ");
3215
- }
3216
- };
3217
-
3218
3234
  // src/utils/Sentence.ts
3219
3235
  var Sentence = class {
3220
3236
  constructor(word, pre, sentence = (pre?.sentence ?? []).concat(word)) {
@@ -3350,6 +3366,7 @@ var wait = (millis) => Wait.wait(millis);
3350
3366
  ViewRouteGateway,
3351
3367
  Wait,
3352
3368
  When,
3369
+ accumulate,
3353
3370
  any,
3354
3371
  api,
3355
3372
  array,
@@ -3500,6 +3517,7 @@ var wait = (millis) => Wait.wait(millis);
3500
3517
  toViewer,
3501
3518
  toWords,
3502
3519
  traverse,
3520
+ traverseSet,
3503
3521
  tryTo,
3504
3522
  tuple,
3505
3523
  tuple2,