@zoodogood/utils 5.1.2-change.4266 → 6.0.0-change.4442

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.
@@ -1 +1 @@
1
- {"version":3,"file":"message_lifecycle.d.ts","sourceRoot":"","sources":["../../src/discordjs/message_lifecycle.ts"],"names":[],"mappings":"AAAA,OAAO,EACN,KAAK,iBAAiB,EAEtB,KAAK,eAAe,EACpB,YAAY,EACZ,OAAO,EACP,KAAK,oBAAoB,EAEzB,KAAK,gBAAgB,EACrB,IAAI,EAEJ,MAAM,YAAY,CAAC;AAQpB,OAAO,EAAE,cAAc,EAAE,MAAM,yBAAyB,CAAC;AAEzD,OAAO,EAEN,KAAK,qBAAqB,EAG1B,MAAM,UAAU,CAAC;AAElB,iBAAS,UAAU,CAClB,CAAC,SACE,IAAI,GACJ,gBAAgB,GAChB,OAAO,GACP,CAAC,EAAE,GAAG;IAAE,OAAO,EAAE,gBAAgB,CAAA;CAAE,CAAC,GACpC,CAAC,EAAE,GAAG;IAAE,IAAI,EAAE,CAAC,OAAO,EAAE,oBAAoB,KAAK,OAAO,CAAC,OAAO,CAAC,CAAA;CAAE,CAAC,EAEvE,MAAM,EAAE,CAAC,GACP;IACF,IAAI,EAAE,CAAC,OAAO,EAAE,oBAAoB,KAAK,OAAO,CAAC,OAAO,CAAC,CAAC;CAC1D,CAWA;AAED,MAAM,WAAW,eAAe;IAC/B,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,SAAS,CAAC,EAAE,OAAO,CAAC;IACpB,UAAU,CAAC,EAAE,OAAO,CAAC;IACrB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,IAAI,CAAC,EAAE,OAAO,CAAC;IACf,MAAM,CAAC,EAAE;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,OAAO,CAAC,EAAE,MAAM,CAAA;KAAE,CAAC;IAC5C,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,KAAK,CAAC,EAAE,eAAe,CAAC;IACxB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,MAAM,CAAC,EAAE;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,KAAK,EAAE,MAAM,CAAC;QAAC,MAAM,CAAC,EAAE,OAAO,CAAA;KAAE,EAAE,CAAC;IAC7D,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,MAAM,CAAC,EAAE;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,OAAO,CAAC,EAAE,MAAM,CAAA;KAAE,CAAC;IAC5C,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,SAAS,CAAC,EAAE,MAAM,EAAE,CAAC;IACrB,eAAe,CAAC,EAAE,qBAAqB,CAAC;IACxC,YAAY,CAAC,EAAE,eAAe,CAAC;IAC/B,UAAU,CAAC,EAAE,UAAU,CAAC,OAAO,cAAc,CAAC,CAAC;IAC/C,KAAK,CAAC,EAAE,iBAAiB,EAAE,CAAC;CAC5B;AAED,wBAAgB,YAAY,CAC3B,KAAK,EAAE;KAAG,GAAG,IAAI,MAAM,YAAY,CAAC,MAAM,CAAC,GAAG,OAAO;CAAE,WAmBvD;AAED,wBAAgB,aAAa,CAAC,WAAW,EAAE,eAAe,wBA8DzD;AAED;;;GAGG;AAEH,wBAAsB,eAAe,CAAC,OAAO,SAAS,OAAO,EAC5D,MAAM,EAAE,UAAU,CAAC,OAAO,UAAU,CAAC,CAAC,CAAC,CAAC,EACxC,OAAO,EAAE,eAAe,+BAIxB;AAED,wBAAsB,WAAW,CAAC,OAAO,SAAS,OAAO,EACxD,MAAM,EAAE,UAAU,CAAC,OAAO,UAAU,CAAC,CAAC,CAAC,CAAC,EACxC,YAAY,EAAE,UAAU,CAAC,OAAO,aAAa,CAAC,EAC9C,WAAW,EAAE,eAAe,GAC1B,OAAO,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC,CAqG3B"}
1
+ {"version":3,"file":"message_lifecycle.d.ts","sourceRoot":"","sources":["../../src/discordjs/message_lifecycle.ts"],"names":[],"mappings":"AAAA,OAAO,EACN,KAAK,iBAAiB,EAEtB,KAAK,eAAe,EACpB,YAAY,EACZ,OAAO,EACP,KAAK,oBAAoB,EAEzB,KAAK,gBAAgB,EACrB,IAAI,EAEJ,MAAM,YAAY,CAAC;AAQpB,OAAO,EAAE,cAAc,EAAE,MAAM,yBAAyB,CAAC;AAEzD,OAAO,EAEN,KAAK,qBAAqB,EAG1B,MAAM,UAAU,CAAC;AAElB,iBAAS,UAAU,CAClB,CAAC,SACE,IAAI,GACJ,gBAAgB,GAChB,OAAO,GACP,CAAC,EAAE,GAAG;IAAE,OAAO,EAAE,gBAAgB,CAAA;CAAE,CAAC,GACpC,CAAC,EAAE,GAAG;IAAE,IAAI,EAAE,CAAC,OAAO,EAAE,oBAAoB,KAAK,OAAO,CAAC,OAAO,CAAC,CAAA;CAAE,CAAC,EAEvE,MAAM,EAAE,CAAC,GACP;IACF,IAAI,EAAE,CAAC,OAAO,EAAE,oBAAoB,KAAK,OAAO,CAAC,OAAO,CAAC,CAAC;CAC1D,CAWA;AAED,MAAM,WAAW,eAAe;IAC/B,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,SAAS,CAAC,EAAE,OAAO,CAAC;IACpB,UAAU,CAAC,EAAE,OAAO,CAAC;IACrB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,IAAI,CAAC,EAAE,OAAO,CAAC;IACf,MAAM,CAAC,EAAE;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,OAAO,CAAC,EAAE,MAAM,CAAA;KAAE,CAAC;IAC5C,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,KAAK,CAAC,EAAE,eAAe,CAAC;IACxB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,MAAM,CAAC,EAAE;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,KAAK,EAAE,MAAM,CAAC;QAAC,MAAM,CAAC,EAAE,OAAO,CAAA;KAAE,EAAE,CAAC;IAC7D,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,MAAM,CAAC,EAAE;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,OAAO,CAAC,EAAE,MAAM,CAAA;KAAE,CAAC;IAC5C,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,SAAS,CAAC,EAAE,MAAM,EAAE,CAAC;IACrB,eAAe,CAAC,EAAE,qBAAqB,CAAC;IACxC,YAAY,CAAC,EAAE,eAAe,CAAC;IAC/B,UAAU,CAAC,EAAE,UAAU,CAAC,OAAO,cAAc,CAAC,CAAC;IAC/C,KAAK,CAAC,EAAE,iBAAiB,EAAE,CAAC;CAC5B;AAED,wBAAgB,YAAY,CAC3B,KAAK,EAAE;KAAG,GAAG,IAAI,MAAM,YAAY,CAAC,MAAM,CAAC,GAAG,OAAO;CAAE,WAmBvD;AAED,wBAAgB,aAAa,CAAC,WAAW,EAAE,eAAe,wBA8DzD;AAED;;;GAGG;AAEH,wBAAsB,eAAe,CAAC,OAAO,SAAS,OAAO,EAC5D,MAAM,EAAE,UAAU,CAAC,OAAO,UAAU,CAAC,CAAC,CAAC,CAAC,EACxC,OAAO,EAAE,eAAe,+BAIxB;AAED,wBAAsB,WAAW,CAAC,OAAO,SAAS,OAAO,EACxD,MAAM,EAAE,UAAU,CAAC,OAAO,UAAU,CAAC,CAAC,CAAC,CAAC,EACxC,YAAY,EAAE,UAAU,CAAC,OAAO,aAAa,CAAC,EAC9C,WAAW,EAAE,eAAe,GAC1B,OAAO,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC,CAoG3B"}
@@ -125,7 +125,6 @@ export async function sendMessage(target, message_data, mut_payload) {
125
125
  if (!chain) {
126
126
  return;
127
127
  }
128
- const channel = sendableOf(target);
129
128
  const index = chain.indexOf(message.id);
130
129
  if (index === 0) {
131
130
  return;
@@ -134,7 +133,7 @@ export async function sendMessage(target, message_data, mut_payload) {
134
133
  if (!child_message_id) {
135
134
  return;
136
135
  }
137
- return await channel.messages.fetch(child_message_id);
136
+ return await sendableOf(target).messages.fetch(child_message_id);
138
137
  })()) ||
139
138
  (await (async () => {
140
139
  const child_message = await justSendMessage(sendableOf(target), mut_payload._chain_child);
@@ -1 +1 @@
1
- {"version":3,"file":"BusyNumeric.d.ts","sourceRoot":"","sources":["../../src/objectives/BusyNumeric.ts"],"names":[],"mappings":"AAuBA;;;;;;;GAOG;AAQH,wBAAgB,YAAY,CAAC,IAAI,EAAE,SAAS,CAAC,MAAM,EAAE,MAAM,CAAC,UAE3D;AACD,qBAAa,WAAW;;IACtB,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;IACvB,QAAQ,CAAC,UAAU,EAAE,CAAC,SAAS,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC,EAAE,CAAM;IACxD,SAAS,EAAE,MAAM,CAAC;IAElB,IAAI,eAAe,YASlB;IAED,IAAI,aAAa,YAShB;gBACW,KAAK,EAAE,MAAM;IAMzB,SAAS,CAAC,KAAK,EAAE,MAAM;IAIvB,cAAc;IAMd,OAAO,CAAC,EAAE,EAAE,MAAM;;;;;IAqClB,WAAW,CAAC,KAAK,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM;IAkEtC,OAAO;;;;MAUL;CACH"}
1
+ {"version":3,"file":"BusyNumeric.d.ts","sourceRoot":"","sources":["../../src/objectives/BusyNumeric.ts"],"names":[],"mappings":"AAuBA;;;;;;;GAOG;AAQH,wBAAgB,YAAY,CAAC,IAAI,EAAE,SAAS,CAAC,MAAM,EAAE,MAAM,CAAC,UAE3D;AACD,qBAAa,WAAW;;IACtB,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;IACvB,QAAQ,CAAC,UAAU,EAAE,CAAC,SAAS,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC,EAAE,CAAM;IACxD,SAAS,EAAE,MAAM,CAAC;IAElB,IAAI,eAAe,YASlB;IAED,IAAI,aAAa,YAShB;gBACW,KAAK,EAAE,MAAM;IAOzB,SAAS,CAAC,KAAK,EAAE,MAAM;IAIvB,cAAc;IAMd,OAAO,CAAC,EAAE,EAAE,MAAM;;;;;IAqClB,WAAW,CAAC,KAAK,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM;IAkEtC,OAAO;;;;MAUL;CACH"}
@@ -59,6 +59,7 @@ export class BusyNumeric {
59
59
  }
60
60
  constructor(range) {
61
61
  assert(range > 0, "Range must be positive");
62
+ assert(range <= Number.MAX_SAFE_INTEGER, "range <= Number.MAX_SAFE_INTEGER");
62
63
  this.range = range;
63
64
  this.free_area = this.range + /* includes position 0 */ 1;
64
65
  }
@@ -131,7 +132,7 @@ export class BusyNumeric {
131
132
  const [index, points] = is_left_included
132
133
  ? [place_index - 1, [target[0], end]]
133
134
  : [place_index, [start, target[1]]];
134
- assert(!(target[0] <= start && target[1] >= end), "Assertion error: [start, end] in range");
135
+ assert(!(target[0] <= start && target[1] >= end), "Assertion error: range [start, end] already in busy area");
135
136
  this.free_area -= size_of_area(points) - size_of_area(target);
136
137
  this.busy_areas.splice(index, 1, points);
137
138
  return;
@@ -1,17 +1,20 @@
1
- import { create_default_preventable } from "../primitives/createDefaultPreventable.js";
2
1
  import { BusyNumeric } from "./BusyNumeric.js";
2
+ export declare const _WEIGHT_AUTO = 1000001;
3
3
  interface IParams<T> {
4
- associatedWeights?: number[];
4
+ associatedWeights?: number[] | typeof _WEIGHT_AUTO;
5
5
  filter?: (item: T) => boolean;
6
6
  }
7
7
  interface IPickContext<T> {
8
- busy_preventable: ReturnType<typeof create_default_preventable> & {
9
- require_insert(): void;
10
- };
11
8
  item: T;
12
9
  pick: (context: IPickContext<T>) => boolean;
13
10
  threshold: number;
14
11
  point: number;
12
+ index_of_item: number;
13
+ }
14
+ interface ILotteryContext {
15
+ index_of_item: number;
16
+ point: number;
17
+ remove_current_from_pull(): void;
15
18
  }
16
19
  export declare class RandomizerContext<T> {
17
20
  hotel: BusyNumeric;
@@ -20,13 +23,15 @@ export declare class RandomizerContext<T> {
20
23
  constructor(array: T[], thresholds?: number[]);
21
24
  static from<T>({ array, associatedWeights, }: {
22
25
  array: T[];
23
- associatedWeights?: IParams<T>["associatedWeights"];
26
+ associatedWeights?: number[];
24
27
  }): RandomizerContext<T>;
25
28
  pickRandom(pick?: IPickContext<T>["pick"]): T | undefined;
29
+ playLottery(): ILotteryContext | undefined;
26
30
  }
27
31
  export declare function pickInThresholds(thresholds: number[], value: number): number;
28
- export declare function thresholdsOf(weights: NonNullable<IParams<unknown>["associatedWeights"]>): number[];
29
- export declare function getRandomElementIndexInWeights(weights: NonNullable<IParams<unknown>["associatedWeights"]>): number | never;
32
+ export declare function thresholdsOf(weights: NonNullable<number[]>): number[];
33
+ export declare function getRandomElementIndexInWeights(weights: NonNullable<number[]>): number | never;
30
34
  export declare function getRandomElementFromArray<T>(array: T[], { associatedWeights, filter }?: IParams<T>): T | undefined;
35
+ export declare function getRandomElementsFromArray<T>(array: T[], amount?: number, { associatedWeights, filter }?: IParams<T>): T[];
31
36
  export {};
32
37
  //# sourceMappingURL=getRandomElementFromArray.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"getRandomElementFromArray.d.ts","sourceRoot":"","sources":["../../src/objectives/getRandomElementFromArray.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,0BAA0B,EAAE,MAAM,2CAA2C,CAAC;AACvF,OAAO,EAAE,WAAW,EAAgB,MAAM,kBAAkB,CAAC;AAG7D,UAAU,OAAO,CAAC,CAAC;IACjB,iBAAiB,CAAC,EAAE,MAAM,EAAE,CAAC;IAC7B,MAAM,CAAC,EAAE,CAAC,IAAI,EAAE,CAAC,KAAK,OAAO,CAAC;CAC/B;AAED,UAAU,YAAY,CAAC,CAAC;IACtB,gBAAgB,EAAE,UAAU,CAAC,OAAO,0BAA0B,CAAC,GAAG;QAAC,cAAc,IAAI,IAAI,CAAA;KAAC,CAAC;IAC3F,IAAI,EAAE,CAAC,CAAC;IACR,IAAI,EAAE,CAAC,OAAO,EAAE,YAAY,CAAC,CAAC,CAAC,KAAK,OAAO,CAAC;IAC5C,SAAS,EAAE,MAAM,CAAC;IAClB,KAAK,EAAE,MAAM,CAAC;CACf;AAED,qBAAa,iBAAiB,CAAC,CAAC;IAC9B,KAAK,EAAE,WAAW,CAAC;IACnB,KAAK,EAAE,CAAC,EAAE,CAAC;IACX,UAAU,CAAC,EAAE,MAAM,EAAE,CAAC;gBACV,KAAK,EAAE,CAAC,EAAE,EAAE,UAAU,CAAC,EAAE,MAAM,EAAE;IAM7C,MAAM,CAAC,IAAI,CAAC,CAAC,EAAE,EACb,KAAK,EACL,iBAAiB,GAClB,EAAE;QACD,KAAK,EAAE,CAAC,EAAE,CAAC;QACX,iBAAiB,CAAC,EAAE,OAAO,CAAC,CAAC,CAAC,CAAC,mBAAmB,CAAC,CAAC;KACrD;IAID,UAAU,CAAC,IAAI,GAAE,YAAY,CAAC,CAAC,CAAC,CAAC,MAAM,CAAc;CAoDtD;AAED,wBAAgB,gBAAgB,CAAC,UAAU,EAAE,MAAM,EAAE,EAAE,KAAK,EAAE,MAAM,GAAG,MAAM,CAY5E;AAED,wBAAgB,YAAY,CAC1B,OAAO,EAAE,WAAW,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC,mBAAmB,CAAC,CAAC,GAIE,MAAM,EAAE,CACtE;AAED,wBAAgB,8BAA8B,CAC5C,OAAO,EAAE,WAAW,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC,mBAAmB,CAAC,CAAC,GAC1D,MAAM,GAAG,KAAK,CAKhB;AAkBD,wBAAgB,yBAAyB,CAAC,CAAC,EACzC,KAAK,EAAE,CAAC,EAAE,EACV,EAAE,iBAAiB,EAAE,MAAmB,EAAE,GAAE,OAAO,CAAC,CAAC,CAAM,iBAW5D"}
1
+ {"version":3,"file":"getRandomElementFromArray.d.ts","sourceRoot":"","sources":["../../src/objectives/getRandomElementFromArray.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,WAAW,EAAgB,MAAM,kBAAkB,CAAC;AAG7D,eAAO,MAAM,YAAY,UAAY,CAAC;AACtC,UAAU,OAAO,CAAC,CAAC;IAClB,iBAAiB,CAAC,EAAE,MAAM,EAAE,GAAG,OAAO,YAAY,CAAC;IACnD,MAAM,CAAC,EAAE,CAAC,IAAI,EAAE,CAAC,KAAK,OAAO,CAAC;CAC9B;AAED,UAAU,YAAY,CAAC,CAAC;IACvB,IAAI,EAAE,CAAC,CAAC;IACR,IAAI,EAAE,CAAC,OAAO,EAAE,YAAY,CAAC,CAAC,CAAC,KAAK,OAAO,CAAC;IAC5C,SAAS,EAAE,MAAM,CAAC;IAClB,KAAK,EAAE,MAAM,CAAC;IACd,aAAa,EAAE,MAAM,CAAC;CACtB;AAED,UAAU,eAAe;IACxB,aAAa,EAAE,MAAM,CAAC;IACtB,KAAK,EAAE,MAAM,CAAC;IACd,wBAAwB,IAAI,IAAI,CAAC;CACjC;AAED,qBAAa,iBAAiB,CAAC,CAAC;IAC/B,KAAK,EAAE,WAAW,CAAC;IACnB,KAAK,EAAE,CAAC,EAAE,CAAC;IACX,UAAU,CAAC,EAAE,MAAM,EAAE,CAAC;gBACV,KAAK,EAAE,CAAC,EAAE,EAAE,UAAU,CAAC,EAAE,MAAM,EAAE;IAc7C,MAAM,CAAC,IAAI,CAAC,CAAC,EAAE,EACd,KAAK,EACL,iBAAiB,GACjB,EAAE;QACF,KAAK,EAAE,CAAC,EAAE,CAAC;QACX,iBAAiB,CAAC,EAAE,MAAM,EAAE,CAAC;KAC7B;IAID,UAAU,CAAC,IAAI,GAAE,YAAY,CAAC,CAAC,CAAC,CAAC,MAAM,CAAc,GAAG,CAAC,GAAG,SAAS;IAsDrE,WAAW,IAAI,eAAe,GAAG,SAAS;CAiD1C;AAED,wBAAgB,gBAAgB,CAAC,UAAU,EAAE,MAAM,EAAE,EAAE,KAAK,EAAE,MAAM,GAAG,MAAM,CAY5E;AAED,wBAAgB,YAAY,CAAC,OAAO,EAAE,WAAW,CAAC,MAAM,EAAE,CAAC,GAGG,MAAM,EAAE,CACrE;AAED,wBAAgB,8BAA8B,CAC7C,OAAO,EAAE,WAAW,CAAC,MAAM,EAAE,CAAC,GAC5B,MAAM,GAAG,KAAK,CAKhB;AAkBD,wBAAgB,yBAAyB,CAAC,CAAC,EAC1C,KAAK,EAAE,CAAC,EAAE,EACV,EAAE,iBAAiB,EAAE,MAAmB,EAAE,GAAE,OAAO,CAAC,CAAC,CAAM,iBA8B3D;AAED,wBAAgB,0BAA0B,CAAC,CAAC,EAC3C,KAAK,EAAE,CAAC,EAAE,EACV,MAAM,SAAI,EACV,EAAE,iBAAiB,EAAE,MAAmB,EAAE,GAAE,OAAO,CAAC,CAAC,CAAM,OAiD3D"}
@@ -1,8 +1,8 @@
1
1
  import assert from "node:assert";
2
2
  import { binary_search } from "../primitives/binary_search.js";
3
- import { create_default_preventable } from "../primitives/createDefaultPreventable.js";
4
3
  import { BusyNumeric, size_of_area } from "./BusyNumeric.js";
5
4
  import { getRandomNumberInRange } from "./getRandomNumberInRange.js";
5
+ export const _WEIGHT_AUTO = 1_000_001;
6
6
  export class RandomizerContext {
7
7
  hotel;
8
8
  array;
@@ -13,6 +13,13 @@ export class RandomizerContext {
13
13
  const range = thresholds?.at(-1) ?? array.length - 1;
14
14
  this.hotel = new BusyNumeric(range);
15
15
  }
16
+ /* Add to your code
17
+ if (associatedWeights === AUTO) {
18
+ // @ts-expect-error User known about AUTO keyword
19
+ associatedWeights = array.map(($) => $._weight);
20
+ }
21
+ associatedWeights?.length && assert(associatedWeights.at(-1)! < Number.MAX_SAFE_INTEGER)
22
+ */
16
23
  static from({ array, associatedWeights, }) {
17
24
  const thresholds = associatedWeights && thresholdsOf(associatedWeights);
18
25
  return new RandomizerContext(array, thresholds);
@@ -24,13 +31,17 @@ export class RandomizerContext {
24
31
  if (!segments_count) {
25
32
  break;
26
33
  }
27
- const target_of_free = getRandomNumberInRange({ max: hotel.free_area - 1 });
34
+ const target_of_free = getRandomNumberInRange({
35
+ max: hotel.free_area - 1,
36
+ });
28
37
  const position = (() => {
29
38
  let segment = 0;
30
39
  let distance = target_of_free;
31
40
  let position = 0;
32
41
  while (true) {
33
- const free_area = (hotel.busy_areas[segment]?.[0] ?? hotel.range + 1) - (hotel.busy_areas[segment - 1]?.[1] ?? -1) - 1;
42
+ const free_area = (hotel.busy_areas[segment]?.[0] ?? hotel.range + 1) -
43
+ (hotel.busy_areas[segment - 1]?.[1] ?? -1) -
44
+ 1;
34
45
  distance -= free_area;
35
46
  position += free_area;
36
47
  if (distance < 0) {
@@ -40,33 +51,69 @@ export class RandomizerContext {
40
51
  segment++;
41
52
  }
42
53
  })();
43
- let _require_insert = false;
44
- const index = thresholds ? pickInThresholds(thresholds, position) : position;
54
+ const index = thresholds
55
+ ? pickInThresholds(thresholds, position)
56
+ : position;
45
57
  const element = array[index];
46
58
  const pickContext = {
47
- busy_preventable: {
48
- ...create_default_preventable(),
49
- require_insert() {
50
- _require_insert = true;
51
- }
52
- },
53
59
  item: element,
60
+ index_of_item: index,
54
61
  pick,
55
62
  threshold: index,
56
63
  point: position,
57
64
  };
58
65
  const picked = pick(pickContext);
59
- if (_require_insert || !picked && !pickContext.busy_preventable.default_prevented()) {
60
- thresholds
61
- ? hotel.insert_area(thresholds[index - 1] + 1 || 0, thresholds[index])
62
- : hotel.bifurcate(index);
63
- }
64
66
  if (picked) {
65
67
  return element;
66
68
  }
69
+ thresholds
70
+ ? hotel.insert_area(thresholds[index - 1] + 1 || 0, thresholds[index])
71
+ : hotel.bifurcate(index);
67
72
  }
68
73
  return undefined;
69
74
  }
75
+ playLottery() {
76
+ const { hotel, thresholds } = this;
77
+ while (true) {
78
+ const segments_count = hotel.segments_count();
79
+ if (!segments_count) {
80
+ break;
81
+ }
82
+ const target_of_free = getRandomNumberInRange({
83
+ max: hotel.free_area - 1,
84
+ });
85
+ const position = (() => {
86
+ let segment = 0;
87
+ let distance = target_of_free;
88
+ let position = 0;
89
+ while (true) {
90
+ const free_area = (hotel.busy_areas[segment]?.[0] ?? hotel.range + 1) -
91
+ (hotel.busy_areas[segment - 1]?.[1] ?? -1) -
92
+ 1;
93
+ distance -= free_area;
94
+ position += free_area;
95
+ if (distance < 0) {
96
+ return position + distance;
97
+ }
98
+ position += size_of_area(hotel.busy_areas[segment] || [0, hotel.range + 1]);
99
+ segment++;
100
+ }
101
+ })();
102
+ const index = thresholds
103
+ ? pickInThresholds(thresholds, position)
104
+ : position;
105
+ const lotteryContext = {
106
+ index_of_item: index,
107
+ point: position,
108
+ remove_current_from_pull() {
109
+ thresholds
110
+ ? hotel.insert_area(thresholds[index - 1] + 1 || 0, thresholds[index])
111
+ : hotel.bifurcate(index);
112
+ },
113
+ };
114
+ return lotteryContext;
115
+ }
116
+ }
70
117
  }
71
118
  export function pickInThresholds(thresholds, value) {
72
119
  assert(thresholds.length > 0);
@@ -108,9 +155,65 @@ export function getRandomElementIndexInWeights(weights) {
108
155
  Повторяем
109
156
  */
110
157
  export function getRandomElementFromArray(array, { associatedWeights, filter = () => true } = {}) {
158
+ assert(array.length, "Invalid array length");
159
+ if (associatedWeights === _WEIGHT_AUTO) {
160
+ // @ts-expect-error User know about AUTO keysymbol
161
+ associatedWeights = array.map(($) => $._weight);
162
+ }
163
+ associatedWeights?.length &&
164
+ assert(associatedWeights.at(-1) < Number.MAX_SAFE_INTEGER);
111
165
  assert(!associatedWeights || associatedWeights.length === array.length, "Incorrectly passed argument associatedWeights: The length of the associatedWeights must exactly match the length of the weights array");
166
+ if (array.length === 1) {
167
+ return array[0];
168
+ }
169
+ // light strategy
170
+ if (!filter) {
171
+ if (associatedWeights) {
172
+ return array[getRandomElementIndexInWeights(associatedWeights)];
173
+ }
174
+ return array[Math.floor(Math.random() * array.length)];
175
+ }
112
176
  return RandomizerContext.from({
113
177
  array,
114
178
  associatedWeights,
115
179
  }).pickRandom(({ item }) => filter(item));
116
180
  }
181
+ export function getRandomElementsFromArray(array, amount = 1, { associatedWeights, filter = () => true } = {}) {
182
+ assert(array.length);
183
+ assert(amount <= array.length);
184
+ assert(amount > 1, `Current amount: ${amount}, use getRandomElementFromArray instead of getRandomElement**s**FromArray if amount is 1`);
185
+ if (associatedWeights === _WEIGHT_AUTO) {
186
+ // @ts-expect-error User know about AUTO keysymbol
187
+ associatedWeights = array.map(($) => $._weight);
188
+ }
189
+ associatedWeights?.length &&
190
+ assert(associatedWeights.at(-1) < Number.MAX_SAFE_INTEGER);
191
+ assert(!associatedWeights || associatedWeights.length === array.length, "Incorrectly passed argument associatedWeights: The length of the associatedWeights must exactly match the length of the weights array");
192
+ if (amount === array.length) {
193
+ return Array.from(array);
194
+ }
195
+ // light strategy
196
+ if (!filter && !associatedWeights) {
197
+ const _array = Array.from(array);
198
+ return Array.from({ length: amount }, () => _array.splice(Math.floor(Math.random() * _array.length), 1)[0]);
199
+ }
200
+ const random_ctx = RandomizerContext.from({
201
+ array,
202
+ associatedWeights,
203
+ });
204
+ return Array.from({ length: amount }, (_, i) => {
205
+ while (true) {
206
+ const lottery_ctx = random_ctx.playLottery();
207
+ if (!lottery_ctx) {
208
+ // BEFORE PULL TO-DO вероятно неграммотное сообщение об ошибке
209
+ throw new Error("Not enought items was pass filter");
210
+ }
211
+ lottery_ctx.remove_current_from_pull();
212
+ const item = array[lottery_ctx.index_of_item];
213
+ if (!filter(item)) {
214
+ continue;
215
+ }
216
+ return item;
217
+ }
218
+ });
219
+ }
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "@zoodogood/utils",
3
3
  "type": "module",
4
- "version": "5.1.2-change.4266",
4
+ "version": "6.0.0-change.4442",
5
5
  "description": "",
6
6
  "main": "lib/index.js",
7
7
  "homepage": "https://zoodogood.github.io/utils",