extra-rand 0.4.0 → 0.4.1
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
|
@@ -89,7 +89,13 @@ interface IWeightedItem {
|
|
|
89
89
|
weight: number
|
|
90
90
|
}
|
|
91
91
|
|
|
92
|
+
function randomPickWeightedItem<T>(items: NonEmptyArray<T>, weights: NonEmptyArray<number>): T
|
|
92
93
|
function randomPickWeightedItem<T extends IWeightedItem>(items: NonEmptyArray<T>): T
|
|
94
|
+
function randomPickWeightedItem<T>(
|
|
95
|
+
generator: IRandomNumberGenerator
|
|
96
|
+
, items: NonEmptyArray<T>
|
|
97
|
+
, weights: NonEmptyArray<number>
|
|
98
|
+
): T
|
|
93
99
|
function randomPickWeightedItem<T extends IWeightedItem>(
|
|
94
100
|
generator: IRandomNumberGenerator
|
|
95
101
|
, items: NonEmptyArray<T>
|
|
@@ -3,5 +3,7 @@ import { IRandomNumberGenerator } from './types.js';
|
|
|
3
3
|
export interface IWeightedItem {
|
|
4
4
|
weight: number;
|
|
5
5
|
}
|
|
6
|
+
export declare function randomPickWeightedItem<T>(items: NonEmptyArray<T>, weights: NonEmptyArray<number>): T;
|
|
6
7
|
export declare function randomPickWeightedItem<T extends IWeightedItem>(items: NonEmptyArray<T>): T;
|
|
8
|
+
export declare function randomPickWeightedItem<T>(generator: IRandomNumberGenerator, items: NonEmptyArray<T>, weights: NonEmptyArray<number>): T;
|
|
7
9
|
export declare function randomPickWeightedItem<T extends IWeightedItem>(generator: IRandomNumberGenerator, items: NonEmptyArray<T>): T;
|
|
@@ -1,16 +1,34 @@
|
|
|
1
1
|
import { randomPickWeightedIndex } from './random-pick-weighted-index.js';
|
|
2
2
|
import { nativeRandomNumberGenerator } from './native-random-number-generator.js';
|
|
3
|
+
import { isArray } from 'extra-utils';
|
|
3
4
|
export function randomPickWeightedItem(...args) {
|
|
4
5
|
let generator;
|
|
5
6
|
let items;
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
7
|
+
let weights;
|
|
8
|
+
switch (args.length) {
|
|
9
|
+
case 1: {
|
|
10
|
+
generator = nativeRandomNumberGenerator;
|
|
11
|
+
[items] = args;
|
|
12
|
+
weights = items.map(option => option.weight);
|
|
13
|
+
break;
|
|
14
|
+
}
|
|
15
|
+
case 2: {
|
|
16
|
+
if (isArray(args[0])) {
|
|
17
|
+
generator = nativeRandomNumberGenerator;
|
|
18
|
+
[items, weights] = args;
|
|
19
|
+
}
|
|
20
|
+
else {
|
|
21
|
+
[generator, items] = args;
|
|
22
|
+
weights = items.map(option => option.weight);
|
|
23
|
+
}
|
|
24
|
+
break;
|
|
25
|
+
}
|
|
26
|
+
case 3: {
|
|
27
|
+
;
|
|
28
|
+
[generator, items, weights] = args;
|
|
29
|
+
break;
|
|
30
|
+
}
|
|
9
31
|
}
|
|
10
|
-
else {
|
|
11
|
-
[generator, items] = args;
|
|
12
|
-
}
|
|
13
|
-
const weights = items.map(option => option.weight);
|
|
14
32
|
const index = randomPickWeightedIndex(generator, weights);
|
|
15
33
|
return items[index];
|
|
16
34
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"random-pick-weighted-item.js","sourceRoot":"","sources":["../src/random-pick-weighted-item.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,uBAAuB,EAAE,MAAM,iCAAiC,CAAA;AAGzE,OAAO,EAAE,2BAA2B,EAAE,MAAM,qCAAqC,CAAA;
|
|
1
|
+
{"version":3,"file":"random-pick-weighted-item.js","sourceRoot":"","sources":["../src/random-pick-weighted-item.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,uBAAuB,EAAE,MAAM,iCAAiC,CAAA;AAGzE,OAAO,EAAE,2BAA2B,EAAE,MAAM,qCAAqC,CAAA;AACjF,OAAO,EAAE,OAAO,EAAE,MAAM,aAAa,CAAA;AAoBrC,MAAM,UAAU,sBAAsB,CAA0B,GAAG,IAQL;IAE5D,IAAI,SAAiC,CAAA;IACrC,IAAI,KAAuB,CAAA;IAC3B,IAAI,OAA8B,CAAA;IAElC,QAAQ,IAAI,CAAC,MAAM,EAAE,CAAC;QACpB,KAAK,CAAC,CAAC,CAAC,CAAC;YACP,SAAS,GAAG,2BAA2B,CACtC;YAAA,CAAC,KAAK,CAAC,GAAG,IAAI,CAAA;YACf,OAAO,GAAG,KAAK,CAAC,GAAG,CAAC,MAAM,CAAC,EAAE,CAAC,MAAM,CAAC,MAAM,CAA0B,CAAA;YAErE,MAAK;QACP,CAAC;QACD,KAAK,CAAC,CAAC,CAAC,CAAC;YACP,IAAI,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;gBACrB,SAAS,GAAG,2BAA2B,CACtC;gBAAA,CAAC,KAAK,EAAE,OAAO,CAAC,GAAG,IAAiE,CAAA;YACvF,CAAC;iBAAM,CAAC;gBACN,CAAC,SAAS,EAAE,KAAK,CAAC,GAAG,IAGpB,CAAA;gBACD,OAAO,GAAG,KAAK,CAAC,GAAG,CAAC,MAAM,CAAC,EAAE,CAAC,MAAM,CAAC,MAAM,CAA0B,CAAA;YACvE,CAAC;YAED,MAAK;QACP,CAAC;QACD,KAAK,CAAC,CAAC,CAAC,CAAC;YACP,CAAC;YAAA,CAAC,SAAS,EAAE,KAAK,EAAE,OAAO,CAAC,GAAG,IAAI,CAAA;YAEnC,MAAK;QACP,CAAC;IACH,CAAC;IAED,MAAM,KAAK,GAAG,uBAAuB,CAAC,SAAS,EAAE,OAAO,CAAC,CAAA;IACzD,OAAO,KAAK,CAAC,KAAK,CAAC,CAAA;AACrB,CAAC"}
|
package/package.json
CHANGED
|
@@ -2,31 +2,69 @@ import { randomPickWeightedIndex } from './random-pick-weighted-index.js'
|
|
|
2
2
|
import { NonEmptyArray } from 'justypes'
|
|
3
3
|
import { IRandomNumberGenerator } from './types.js'
|
|
4
4
|
import { nativeRandomNumberGenerator } from './native-random-number-generator.js'
|
|
5
|
+
import { isArray } from 'extra-utils'
|
|
5
6
|
|
|
6
7
|
export interface IWeightedItem {
|
|
7
8
|
weight: number
|
|
8
9
|
}
|
|
9
10
|
|
|
11
|
+
export function randomPickWeightedItem<T>(
|
|
12
|
+
items: NonEmptyArray<T>
|
|
13
|
+
, weights: NonEmptyArray<number>
|
|
14
|
+
): T
|
|
10
15
|
export function randomPickWeightedItem<T extends IWeightedItem>(items: NonEmptyArray<T>): T
|
|
16
|
+
export function randomPickWeightedItem<T>(
|
|
17
|
+
generator: IRandomNumberGenerator
|
|
18
|
+
, items: NonEmptyArray<T>
|
|
19
|
+
, weights: NonEmptyArray<number>
|
|
20
|
+
): T
|
|
11
21
|
export function randomPickWeightedItem<T extends IWeightedItem>(
|
|
12
22
|
generator: IRandomNumberGenerator
|
|
13
23
|
, items: NonEmptyArray<T>
|
|
14
24
|
): T
|
|
15
25
|
export function randomPickWeightedItem<T extends IWeightedItem>(...args:
|
|
26
|
+
| [items: NonEmptyArray<T>, weights: NonEmptyArray<number>]
|
|
16
27
|
| [items: NonEmptyArray<T>]
|
|
28
|
+
| [
|
|
29
|
+
generator: IRandomNumberGenerator
|
|
30
|
+
, items: NonEmptyArray<T>
|
|
31
|
+
, weights: NonEmptyArray<number>
|
|
32
|
+
]
|
|
17
33
|
| [generator: IRandomNumberGenerator, items: NonEmptyArray<T>]
|
|
18
34
|
): T {
|
|
19
35
|
let generator: IRandomNumberGenerator
|
|
20
36
|
let items: NonEmptyArray<T>
|
|
37
|
+
let weights: NonEmptyArray<number>
|
|
38
|
+
|
|
39
|
+
switch (args.length) {
|
|
40
|
+
case 1: {
|
|
41
|
+
generator = nativeRandomNumberGenerator
|
|
42
|
+
;[items] = args
|
|
43
|
+
weights = items.map(option => option.weight) as NonEmptyArray<number>
|
|
44
|
+
|
|
45
|
+
break
|
|
46
|
+
}
|
|
47
|
+
case 2: {
|
|
48
|
+
if (isArray(args[0])) {
|
|
49
|
+
generator = nativeRandomNumberGenerator
|
|
50
|
+
;[items, weights] = args as [items: NonEmptyArray<T>, weights: NonEmptyArray<number>]
|
|
51
|
+
} else {
|
|
52
|
+
[generator, items] = args as [
|
|
53
|
+
generator: IRandomNumberGenerator
|
|
54
|
+
, items: NonEmptyArray<T>
|
|
55
|
+
]
|
|
56
|
+
weights = items.map(option => option.weight) as NonEmptyArray<number>
|
|
57
|
+
}
|
|
58
|
+
|
|
59
|
+
break
|
|
60
|
+
}
|
|
61
|
+
case 3: {
|
|
62
|
+
;[generator, items, weights] = args
|
|
21
63
|
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
;[items] = args
|
|
25
|
-
} else {
|
|
26
|
-
[generator, items] = args
|
|
64
|
+
break
|
|
65
|
+
}
|
|
27
66
|
}
|
|
28
67
|
|
|
29
|
-
const weights = items.map(option => option.weight) as NonEmptyArray<number>
|
|
30
68
|
const index = randomPickWeightedIndex(generator, weights)
|
|
31
69
|
return items[index]
|
|
32
70
|
}
|