extra-rand 0.3.2 → 0.4.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 (70) hide show
  1. package/README.md +52 -66
  2. package/lib/index.d.ts +6 -7
  3. package/lib/index.js +6 -7
  4. package/lib/index.js.map +1 -1
  5. package/lib/native-random-number-generator.d.ts +1 -1
  6. package/lib/native-random-number-generator.js +1 -1
  7. package/lib/random-bool.js +4 -4
  8. package/lib/random-bool.js.map +1 -1
  9. package/lib/random-float.d.ts +3 -0
  10. package/lib/random-float.js +16 -0
  11. package/lib/random-float.js.map +1 -0
  12. package/lib/random-int-inclusive.js +4 -4
  13. package/lib/random-int-inclusive.js.map +1 -1
  14. package/lib/random-int.js +4 -4
  15. package/lib/random-int.js.map +1 -1
  16. package/lib/random-number.d.ts +17 -0
  17. package/lib/random-number.js +42 -0
  18. package/lib/random-number.js.map +1 -0
  19. package/lib/random-pick-index.d.ts +4 -0
  20. package/lib/random-pick-index.js +15 -0
  21. package/lib/random-pick-index.js.map +1 -0
  22. package/lib/random-pick-item.d.ts +4 -0
  23. package/lib/random-pick-item.js +16 -0
  24. package/lib/random-pick-item.js.map +1 -0
  25. package/lib/random-pick-weighted-index.d.ts +4 -0
  26. package/lib/random-pick-weighted-index.js +15 -0
  27. package/lib/random-pick-weighted-index.js.map +1 -0
  28. package/lib/random-pick-weighted-item.d.ts +7 -0
  29. package/lib/random-pick-weighted-item.js +17 -0
  30. package/lib/random-pick-weighted-item.js.map +1 -0
  31. package/lib/shuffle.js +2 -2
  32. package/package.json +2 -2
  33. package/src/index.ts +6 -8
  34. package/src/native-random-number-generator.ts +1 -1
  35. package/src/random-bool.ts +4 -4
  36. package/src/{random.ts → random-float.ts} +9 -9
  37. package/src/random-int-inclusive.ts +6 -6
  38. package/src/random-int.ts +6 -6
  39. package/src/random-number.ts +63 -0
  40. package/src/random-pick-index.ts +26 -0
  41. package/src/random-pick-item.ts +27 -0
  42. package/src/{random-index-by-weight.ts → random-pick-weighted-index.ts} +8 -8
  43. package/src/random-pick-weighted-item.ts +32 -0
  44. package/src/shuffle.ts +2 -2
  45. package/lib/map-to-index-by-weight.d.ts +0 -2
  46. package/lib/map-to-index-by-weight.js +0 -29
  47. package/lib/map-to-index-by-weight.js.map +0 -1
  48. package/lib/map-to-range.d.ts +0 -1
  49. package/lib/map-to-range.js +0 -6
  50. package/lib/map-to-range.js.map +0 -1
  51. package/lib/random-by-model.d.ts +0 -17
  52. package/lib/random-by-model.js +0 -42
  53. package/lib/random-by-model.js.map +0 -1
  54. package/lib/random-by-weight-model.d.ts +0 -8
  55. package/lib/random-by-weight-model.js +0 -16
  56. package/lib/random-by-weight-model.js.map +0 -1
  57. package/lib/random-index-by-weight.d.ts +0 -4
  58. package/lib/random-index-by-weight.js +0 -15
  59. package/lib/random-index-by-weight.js.map +0 -1
  60. package/lib/random-weighted.d.ts +0 -7
  61. package/lib/random-weighted.js +0 -17
  62. package/lib/random-weighted.js.map +0 -1
  63. package/lib/random.d.ts +0 -3
  64. package/lib/random.js +0 -16
  65. package/lib/random.js.map +0 -1
  66. package/src/map-to-index-by-weight.ts +0 -36
  67. package/src/map-to-range.ts +0 -9
  68. package/src/random-by-model.ts +0 -63
  69. package/src/random-by-weight-model.ts +0 -32
  70. package/src/random-weighted.ts +0 -32
package/README.md CHANGED
@@ -15,13 +15,13 @@ interface IRandomNumberGenerator {
15
15
  }
16
16
  ```
17
17
 
18
- ### random
18
+ ### randomFloat
19
19
  ```ts
20
- function random(min: number, max: number): number
21
- function random(generator: IRandomNumberGenerator, min: number, max: number): number
20
+ function randomFloat(min: number, max: number): number
21
+ function randomFloat(generator: IRandomNumberGenerator, min: number, max: number): number
22
22
  ```
23
23
 
24
- The function returns a number in the range `[min, max)`.
24
+ The function returns a float in the range `[min, max)`.
25
25
 
26
26
  ### randomInt
27
27
  ```ts
@@ -43,97 +43,83 @@ function randomIntInclusive(
43
43
 
44
44
  The function returns an integer in the range `[Math.ceil(min), Math.floor(max)]`.
45
45
 
46
- ### randomBool
47
- ```ts
48
- function randomBool(probabilityOfTrue: number): boolean
49
- function randomBool(generator: IRandomNumberGenerator, probabilityOfTrue: number): boolean
50
- ```
51
-
52
- ### randomIndexByWeight
53
- ```ts
54
- function randomIndexByWeight(weights: NonEmptyArray<number>): number
55
- function randomIndexByWeight(
56
- generator: IRandomNumberGenerator
57
- , weights: NonEmptyArray<number>
58
- ): number
59
- ```
60
-
61
- The function returns an index of one of weights.
62
-
63
- ### randomWeighted
64
- ```ts
65
- interface IWeighted {
66
- weight: number
67
- }
68
-
69
- function randomWeighted<T extends IWeighted>(values: NonEmptyArray<T>): T
70
- function randomWeighted<T extends IWeighted>(
71
- generator: IRandomNumberGenerator
72
- , values: NonEmptyArray<T>
73
- ): T
74
- ```
75
-
76
- ### randomByWeightModel
77
- ```ts
78
- type IWeightModel<T> = NonEmptyArray<{
79
- weight: number
80
- value: T
81
- }>
82
-
83
- function randomByWeightModel<T>(model: IWeightModel<T>): T
84
- function randomByWeightModel<T>(generator: IRandomNumberGenerator, model: IWeightModel<T>): T
85
- ```
86
-
87
- ### randomByModel
46
+ ### randomNumber
88
47
  ```ts
89
- enum Type {
48
+ enum NumberType {
90
49
  Float
91
50
  , Integer
92
51
  , IntegerInclusive
93
52
  }
94
53
 
95
- type IRandomModel =
54
+ type INumberModel =
96
55
  | number
97
56
  | Getter<number>
98
57
  | {
99
- type: Type
58
+ type: NumberType
100
59
  min: number
101
60
  max: number
102
61
  }
103
62
  | NonEmptyArray<{
104
63
  weight: number
105
- value: IRandomModel
64
+ model: INumberModel
106
65
  }>
107
66
 
67
+ function randomNumber(model: INumberModel): number
68
+ function randomNumber(generator: IRandomNumberGenerator, model: INumberModel): number
69
+ ```
108
70
 
109
- function randomByModel(model: IRandomModel): number
110
- function randomByModel(generator: IRandomNumberGenerator, model: IRandomModel): number
71
+ ### randomBool
72
+ ```ts
73
+ function randomBool(probabilityOfTrue: number): boolean
74
+ function randomBool(generator: IRandomNumberGenerator, probabilityOfTrue: number): boolean
111
75
  ```
112
76
 
113
- ### shuffle
77
+ ### randomPickItem
114
78
  ```ts
115
- function shuffle(arr: unknown[]): void
116
- function shuffle(generator: IRandomNumberGenerator, arr: unknown[]): void
79
+ function randomPickItem<T>(items: NonEmptyArray<T>): T
80
+ function randomPickItem<T>(
81
+ generator: IRandomNumberGenerator
82
+ , items: NonEmptyArray<T>
83
+ ): T
84
+ ```
85
+
86
+ ### randomPickWeightedItem
87
+ ```ts
88
+ interface IWeightedItem {
89
+ weight: number
90
+ }
91
+
92
+ function randomPickWeightedItem<T extends IWeightedItem>(items: NonEmptyArray<T>): T
93
+ function randomPickWeightedItem<T extends IWeightedItem>(
94
+ generator: IRandomNumberGenerator
95
+ , items: NonEmptyArray<T>
96
+ ): T
117
97
  ```
118
98
 
119
- ### mapToRange
99
+ ### randomPickIndex
120
100
  ```ts
121
- function mapToRange(
122
- value: number
123
- , oldMin: number, oldMax: number
124
- , newMin: number, newMax: number
101
+ function randomPickIndex(items: NonEmptyArray<unknown>): number
102
+ function randomPickIndex(
103
+ generator: IRandomNumberGenerator
104
+ , items: NonEmptyArray<unknown>
125
105
  ): number
126
106
  ```
127
107
 
128
- A low-level function helps you to use random number generators other than `Math.random()`.
108
+ The function returns an integer in the range `[0, items.length]`.
129
109
 
130
- ### mapToIndexByWeight
110
+ ### randomPickWeightedIndex
131
111
  ```ts
132
- function mapToIndexByWeight(
133
- value: number
134
- , oldMin: number, oldMax: number
112
+ function randomPickWeightedIndex(weights: NonEmptyArray<number>): number
113
+ function randomPickWeightedIndex(
114
+ generator: IRandomNumberGenerator
135
115
  , weights: NonEmptyArray<number>
136
116
  ): number
137
117
  ```
138
118
 
139
- A low-level function helps you to use random number generators other than `Math.random()`.
119
+ The function returns an integer in the range `[0, weights.length]`.
120
+
121
+ ### shuffle
122
+ ```ts
123
+ function shuffle(arr: unknown[]): void
124
+ function shuffle(generator: IRandomNumberGenerator, arr: unknown[]): void
125
+ ```
package/lib/index.d.ts CHANGED
@@ -1,12 +1,11 @@
1
1
  export * from './types.js';
2
- export * from './random.js';
2
+ export * from './random-float.js';
3
3
  export * from './random-int.js';
4
4
  export * from './random-int-inclusive.js';
5
+ export * from './random-number.js';
5
6
  export * from './random-bool.js';
6
- export * from './random-index-by-weight.js';
7
- export * from './random-weighted.js';
8
- export * from './random-by-weight-model.js';
9
- export * from './random-by-model.js';
7
+ export * from './random-pick-item.js';
8
+ export * from './random-pick-weighted-item.js';
9
+ export * from './random-pick-index.js';
10
+ export * from './random-pick-weighted-index.js';
10
11
  export * from './shuffle.js';
11
- export * from './map-to-range.js';
12
- export * from './map-to-index-by-weight.js';
package/lib/index.js CHANGED
@@ -1,13 +1,12 @@
1
1
  export * from './types.js';
2
- export * from './random.js';
2
+ export * from './random-float.js';
3
3
  export * from './random-int.js';
4
4
  export * from './random-int-inclusive.js';
5
+ export * from './random-number.js';
5
6
  export * from './random-bool.js';
6
- export * from './random-index-by-weight.js';
7
- export * from './random-weighted.js';
8
- export * from './random-by-weight-model.js';
9
- export * from './random-by-model.js';
7
+ export * from './random-pick-item.js';
8
+ export * from './random-pick-weighted-item.js';
9
+ export * from './random-pick-index.js';
10
+ export * from './random-pick-weighted-index.js';
10
11
  export * from './shuffle.js';
11
- export * from './map-to-range.js';
12
- export * from './map-to-index-by-weight.js';
13
12
  //# sourceMappingURL=index.js.map
package/lib/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,cAAc,YAAY,CAAA;AAE1B,cAAc,aAAa,CAAA;AAC3B,cAAc,iBAAiB,CAAA;AAC/B,cAAc,2BAA2B,CAAA;AACzC,cAAc,kBAAkB,CAAA;AAChC,cAAc,6BAA6B,CAAA;AAC3C,cAAc,sBAAsB,CAAA;AACpC,cAAc,6BAA6B,CAAA;AAC3C,cAAc,sBAAsB,CAAA;AACpC,cAAc,cAAc,CAAA;AAE5B,cAAc,mBAAmB,CAAA;AACjC,cAAc,6BAA6B,CAAA"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,cAAc,YAAY,CAAA;AAE1B,cAAc,mBAAmB,CAAA;AACjC,cAAc,iBAAiB,CAAA;AAC/B,cAAc,2BAA2B,CAAA;AACzC,cAAc,oBAAoB,CAAA;AAClC,cAAc,kBAAkB,CAAA;AAChC,cAAc,uBAAuB,CAAA;AACrC,cAAc,gCAAgC,CAAA;AAC9C,cAAc,wBAAwB,CAAA;AACtC,cAAc,iCAAiC,CAAA;AAC/C,cAAc,cAAc,CAAA"}
@@ -1,2 +1,2 @@
1
1
  import { IRandomNumberGenerator } from './types.js';
2
- export declare const NativeRandomNumberGenerator: IRandomNumberGenerator;
2
+ export declare const nativeRandomNumberGenerator: IRandomNumberGenerator;
@@ -1,4 +1,4 @@
1
- export const NativeRandomNumberGenerator = {
1
+ export const nativeRandomNumberGenerator = {
2
2
  next: Math.random
3
3
  };
4
4
  //# sourceMappingURL=native-random-number-generator.js.map
@@ -1,15 +1,15 @@
1
- import { NativeRandomNumberGenerator } from './native-random-number-generator.js';
2
- import { random } from './random.js';
1
+ import { nativeRandomNumberGenerator } from './native-random-number-generator.js';
2
+ import { randomFloat } from './random-float.js';
3
3
  export function randomBool(...args) {
4
4
  let generator;
5
5
  let probabilityOfTrue;
6
6
  if (args.length === 1) {
7
- generator = NativeRandomNumberGenerator;
7
+ generator = nativeRandomNumberGenerator;
8
8
  [probabilityOfTrue] = args;
9
9
  }
10
10
  else {
11
11
  [generator, probabilityOfTrue] = args;
12
12
  }
13
- return random(generator, 0, 1) < probabilityOfTrue;
13
+ return randomFloat(generator, 0, 1) < probabilityOfTrue;
14
14
  }
15
15
  //# sourceMappingURL=random-bool.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"random-bool.js","sourceRoot":"","sources":["../src/random-bool.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,2BAA2B,EAAE,MAAM,qCAAqC,CAAA;AACjF,OAAO,EAAE,MAAM,EAAE,MAAM,aAAa,CAAA;AAOpC,MAAM,UAAU,UAAU,CAAC,GAAG,IAEkC;IAE9D,IAAI,SAAiC,CAAA;IACrC,IAAI,iBAAyB,CAAA;IAE7B,IAAI,IAAI,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QACtB,SAAS,GAAG,2BAA2B,CACtC;QAAA,CAAC,iBAAiB,CAAC,GAAG,IAAI,CAAA;IAC7B,CAAC;SAAM,CAAC;QACN,CAAC,SAAS,EAAE,iBAAiB,CAAC,GAAG,IAAI,CAAA;IACvC,CAAC;IAED,OAAO,MAAM,CAAC,SAAS,EAAE,CAAC,EAAE,CAAC,CAAC,GAAG,iBAAiB,CAAA;AACpD,CAAC"}
1
+ {"version":3,"file":"random-bool.js","sourceRoot":"","sources":["../src/random-bool.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,2BAA2B,EAAE,MAAM,qCAAqC,CAAA;AACjF,OAAO,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAA;AAO/C,MAAM,UAAU,UAAU,CAAC,GAAG,IAEkC;IAE9D,IAAI,SAAiC,CAAA;IACrC,IAAI,iBAAyB,CAAA;IAE7B,IAAI,IAAI,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QACtB,SAAS,GAAG,2BAA2B,CACtC;QAAA,CAAC,iBAAiB,CAAC,GAAG,IAAI,CAAA;IAC7B,CAAC;SAAM,CAAC;QACN,CAAC,SAAS,EAAE,iBAAiB,CAAC,GAAG,IAAI,CAAA;IACvC,CAAC;IAED,OAAO,WAAW,CAAC,SAAS,EAAE,CAAC,EAAE,CAAC,CAAC,GAAG,iBAAiB,CAAA;AACzD,CAAC"}
@@ -0,0 +1,3 @@
1
+ import { IRandomNumberGenerator } from './types.js';
2
+ export declare function randomFloat(min: number, max: number): number;
3
+ export declare function randomFloat(generator: IRandomNumberGenerator, min: number, max: number): number;
@@ -0,0 +1,16 @@
1
+ import { remap } from 'extra-utils';
2
+ import { nativeRandomNumberGenerator } from './native-random-number-generator.js';
3
+ export function randomFloat(...args) {
4
+ let generator;
5
+ let min;
6
+ let max;
7
+ if (args.length === 2) {
8
+ generator = nativeRandomNumberGenerator;
9
+ [min, max] = args;
10
+ }
11
+ else {
12
+ [generator, min, max] = args;
13
+ }
14
+ return remap(generator.next(), [0, 1], [min, max]);
15
+ }
16
+ //# sourceMappingURL=random-float.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"random-float.js","sourceRoot":"","sources":["../src/random-float.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,EAAE,MAAM,aAAa,CAAA;AAEnC,OAAO,EAAE,2BAA2B,EAAE,MAAM,qCAAqC,CAAA;AAQjF,MAAM,UAAU,WAAW,CAAC,GAAG,IAEgC;IAE7D,IAAI,SAAiC,CAAA;IACrC,IAAI,GAAW,CAAA;IACf,IAAI,GAAW,CAAA;IAEf,IAAI,IAAI,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QACtB,SAAS,GAAG,2BAA2B,CACtC;QAAA,CAAC,GAAG,EAAE,GAAG,CAAC,GAAG,IAAI,CAAA;IACpB,CAAC;SAAM,CAAC;QACN,CAAC,SAAS,EAAE,GAAG,EAAE,GAAG,CAAC,GAAG,IAAI,CAAA;IAC9B,CAAC;IAED,OAAO,KAAK,CACV,SAAS,CAAC,IAAI,EAAE,EAChB,CAAC,CAAC,EAAE,CAAC,CAAC,EACN,CAAC,GAAG,EAAE,GAAG,CAAC,CACX,CAAA;AACH,CAAC"}
@@ -1,16 +1,16 @@
1
- import { mapToRange } from './map-to-range.js';
2
- import { NativeRandomNumberGenerator } from './native-random-number-generator.js';
1
+ import { remap } from 'extra-utils';
2
+ import { nativeRandomNumberGenerator } from './native-random-number-generator.js';
3
3
  export function randomIntInclusive(...args) {
4
4
  let generator;
5
5
  let min;
6
6
  let max;
7
7
  if (args.length === 2) {
8
- generator = NativeRandomNumberGenerator;
8
+ generator = nativeRandomNumberGenerator;
9
9
  [min, max] = args;
10
10
  }
11
11
  else {
12
12
  [generator, min, max] = args;
13
13
  }
14
- return Math.floor(mapToRange(generator.next(), 0, 1, Math.ceil(min), Math.floor(max) + 1));
14
+ return Math.floor(remap(generator.next(), [0, 1], [Math.ceil(min), Math.floor(max) + 1]));
15
15
  }
16
16
  //# sourceMappingURL=random-int-inclusive.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"random-int-inclusive.js","sourceRoot":"","sources":["../src/random-int-inclusive.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,mBAAmB,CAAA;AAE9C,OAAO,EAAE,2BAA2B,EAAE,MAAM,qCAAqC,CAAA;AAWjF,MAAM,UAAU,kBAAkB,CAAC,GAAG,IAEyB;IAE7D,IAAI,SAAiC,CAAA;IACrC,IAAI,GAAW,CAAA;IACf,IAAI,GAAW,CAAA;IAEf,IAAI,IAAI,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QACtB,SAAS,GAAG,2BAA2B,CACtC;QAAA,CAAC,GAAG,EAAE,GAAG,CAAC,GAAG,IAAI,CAAA;IACpB,CAAC;SAAM,CAAC;QACN,CAAC,SAAS,EAAE,GAAG,EAAE,GAAG,CAAC,GAAG,IAAI,CAAA;IAC9B,CAAC;IAED,OAAO,IAAI,CAAC,KAAK,CAAC,UAAU,CAC1B,SAAS,CAAC,IAAI,EAAE,EAChB,CAAC,EAAE,CAAC,EACJ,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,EAAE,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,GAAG,CAAC,CACpC,CAAC,CAAA;AACJ,CAAC"}
1
+ {"version":3,"file":"random-int-inclusive.js","sourceRoot":"","sources":["../src/random-int-inclusive.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,EAAE,MAAM,aAAa,CAAA;AAEnC,OAAO,EAAE,2BAA2B,EAAE,MAAM,qCAAqC,CAAA;AAWjF,MAAM,UAAU,kBAAkB,CAAC,GAAG,IAEyB;IAE7D,IAAI,SAAiC,CAAA;IACrC,IAAI,GAAW,CAAA;IACf,IAAI,GAAW,CAAA;IAEf,IAAI,IAAI,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QACtB,SAAS,GAAG,2BAA2B,CACtC;QAAA,CAAC,GAAG,EAAE,GAAG,CAAC,GAAG,IAAI,CAAA;IACpB,CAAC;SAAM,CAAC;QACN,CAAC,SAAS,EAAE,GAAG,EAAE,GAAG,CAAC,GAAG,IAAI,CAAA;IAC9B,CAAC;IAED,OAAO,IAAI,CAAC,KAAK,CAAC,KAAK,CACrB,SAAS,CAAC,IAAI,EAAE,EAChB,CAAC,CAAC,EAAE,CAAC,CAAC,EACN,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,EAAE,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,CACtC,CAAC,CAAA;AACJ,CAAC"}
package/lib/random-int.js CHANGED
@@ -1,16 +1,16 @@
1
- import { mapToRange } from './map-to-range.js';
2
- import { NativeRandomNumberGenerator } from './native-random-number-generator.js';
1
+ import { remap } from 'extra-utils';
2
+ import { nativeRandomNumberGenerator } from './native-random-number-generator.js';
3
3
  export function randomInt(...args) {
4
4
  let generator;
5
5
  let min;
6
6
  let max;
7
7
  if (args.length === 2) {
8
- generator = NativeRandomNumberGenerator;
8
+ generator = nativeRandomNumberGenerator;
9
9
  [min, max] = args;
10
10
  }
11
11
  else {
12
12
  [generator, min, max] = args;
13
13
  }
14
- return Math.floor(mapToRange(generator.next(), 0, 1, Math.ceil(min), Math.floor(max)));
14
+ return Math.floor(remap(generator.next(), [0, 1], [Math.ceil(min), Math.floor(max)]));
15
15
  }
16
16
  //# sourceMappingURL=random-int.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"random-int.js","sourceRoot":"","sources":["../src/random-int.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,mBAAmB,CAAA;AAE9C,OAAO,EAAE,2BAA2B,EAAE,MAAM,qCAAqC,CAAA;AAQjF,MAAM,UAAU,SAAS,CAAC,GAAG,IAEkC;IAE7D,IAAI,SAAiC,CAAA;IACrC,IAAI,GAAW,CAAA;IACf,IAAI,GAAW,CAAA;IAEf,IAAI,IAAI,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QACtB,SAAS,GAAG,2BAA2B,CACtC;QAAA,CAAC,GAAG,EAAE,GAAG,CAAC,GAAG,IAAI,CAAA;IACpB,CAAC;SAAM,CAAC;QACN,CAAC,SAAS,EAAE,GAAG,EAAE,GAAG,CAAC,GAAG,IAAI,CAAA;IAC9B,CAAC;IAED,OAAO,IAAI,CAAC,KAAK,CAAC,UAAU,CAC1B,SAAS,CAAC,IAAI,EAAE,EAChB,CAAC,EAAE,CAAC,EACJ,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,EAAE,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,CAChC,CAAC,CAAA;AACJ,CAAC"}
1
+ {"version":3,"file":"random-int.js","sourceRoot":"","sources":["../src/random-int.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,EAAE,MAAM,aAAa,CAAA;AAEnC,OAAO,EAAE,2BAA2B,EAAE,MAAM,qCAAqC,CAAA;AAQjF,MAAM,UAAU,SAAS,CAAC,GAAG,IAEkC;IAE7D,IAAI,SAAiC,CAAA;IACrC,IAAI,GAAW,CAAA;IACf,IAAI,GAAW,CAAA;IAEf,IAAI,IAAI,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QACtB,SAAS,GAAG,2BAA2B,CACtC;QAAA,CAAC,GAAG,EAAE,GAAG,CAAC,GAAG,IAAI,CAAA;IACpB,CAAC;SAAM,CAAC;QACN,CAAC,SAAS,EAAE,GAAG,EAAE,GAAG,CAAC,GAAG,IAAI,CAAA;IAC9B,CAAC;IAED,OAAO,IAAI,CAAC,KAAK,CAAC,KAAK,CACrB,SAAS,CAAC,IAAI,EAAE,EAChB,CAAC,CAAC,EAAE,CAAC,CAAC,EACN,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,EAAE,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAClC,CAAC,CAAA;AACJ,CAAC"}
@@ -0,0 +1,17 @@
1
+ import { Getter, NonEmptyArray } from 'justypes';
2
+ import { IRandomNumberGenerator } from './types.js';
3
+ export declare enum NumberType {
4
+ Float = 0,
5
+ Integer = 1,
6
+ IntegerInclusive = 2
7
+ }
8
+ export type INumberModel = number | Getter<number> | {
9
+ type: NumberType;
10
+ min: number;
11
+ max: number;
12
+ } | NonEmptyArray<{
13
+ weight: number;
14
+ model: INumberModel;
15
+ }>;
16
+ export declare function randomNumber(model: INumberModel): number;
17
+ export declare function randomNumber(generator: IRandomNumberGenerator, model: INumberModel): number;
@@ -0,0 +1,42 @@
1
+ import { isArray, isFunction, isNumber } from 'extra-utils';
2
+ import { randomFloat } from './random-float.js';
3
+ import { randomInt } from './random-int.js';
4
+ import { randomIntInclusive } from './random-int-inclusive.js';
5
+ import { nativeRandomNumberGenerator } from './native-random-number-generator.js';
6
+ import { randomPickWeightedItem } from './random-pick-weighted-item.js';
7
+ export var NumberType;
8
+ (function (NumberType) {
9
+ NumberType[NumberType["Float"] = 0] = "Float";
10
+ NumberType[NumberType["Integer"] = 1] = "Integer";
11
+ NumberType[NumberType["IntegerInclusive"] = 2] = "IntegerInclusive";
12
+ })(NumberType || (NumberType = {}));
13
+ export function randomNumber(...args) {
14
+ let generator;
15
+ let model;
16
+ if (args.length === 1) {
17
+ generator = nativeRandomNumberGenerator;
18
+ [model] = args;
19
+ }
20
+ else {
21
+ [generator, model] = args;
22
+ }
23
+ if (isNumber(model)) {
24
+ return model;
25
+ }
26
+ else if (isFunction(model)) {
27
+ return model();
28
+ }
29
+ else if (isArray(model)) {
30
+ const item = randomPickWeightedItem(generator, model);
31
+ return randomNumber(generator, item.model);
32
+ }
33
+ else {
34
+ const { type, min, max } = model;
35
+ switch (type) {
36
+ case NumberType.Float: return randomFloat(generator, min, max);
37
+ case NumberType.Integer: return randomInt(generator, min, max);
38
+ case NumberType.IntegerInclusive: return randomIntInclusive(generator, min, max);
39
+ }
40
+ }
41
+ }
42
+ //# sourceMappingURL=random-number.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"random-number.js","sourceRoot":"","sources":["../src/random-number.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,OAAO,EAAE,UAAU,EAAE,QAAQ,EAAE,MAAM,aAAa,CAAA;AAC3D,OAAO,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAA;AAC/C,OAAO,EAAE,SAAS,EAAE,MAAM,iBAAiB,CAAA;AAC3C,OAAO,EAAE,kBAAkB,EAAE,MAAM,2BAA2B,CAAA;AAE9D,OAAO,EAAE,2BAA2B,EAAE,MAAM,qCAAqC,CAAA;AACjF,OAAO,EAAE,sBAAsB,EAAE,MAAM,gCAAgC,CAAA;AAEvE,MAAM,CAAN,IAAY,UAIX;AAJD,WAAY,UAAU;IACpB,6CAAK,CAAA;IACL,iDAAO,CAAA;IACP,mEAAgB,CAAA;AAClB,CAAC,EAJW,UAAU,KAAV,UAAU,QAIrB;AAoBD,MAAM,UAAU,YAAY,CAAC,GAAG,IAE0B;IAExD,IAAI,SAAiC,CAAA;IACrC,IAAI,KAAmB,CAAA;IAEvB,IAAI,IAAI,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QACtB,SAAS,GAAG,2BAA2B,CACtC;QAAA,CAAC,KAAK,CAAC,GAAG,IAAI,CAAA;IACjB,CAAC;SAAM,CAAC;QACN,CAAC,SAAS,EAAE,KAAK,CAAC,GAAG,IAAI,CAAA;IAC3B,CAAC;IAED,IAAI,QAAQ,CAAC,KAAK,CAAC,EAAE,CAAC;QACpB,OAAO,KAAK,CAAA;IACd,CAAC;SAAM,IAAI,UAAU,CAAC,KAAK,CAAC,EAAE,CAAC;QAC7B,OAAO,KAAK,EAAE,CAAA;IAChB,CAAC;SAAM,IAAI,OAAO,CAAC,KAAK,CAAC,EAAE,CAAC;QAC1B,MAAM,IAAI,GAAG,sBAAsB,CAAC,SAAS,EAAE,KAAK,CAAC,CAAA;QACrD,OAAO,YAAY,CAAC,SAAS,EAAE,IAAI,CAAC,KAAK,CAAC,CAAA;IAC5C,CAAC;SAAM,CAAC;QACN,MAAM,EAAE,IAAI,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,KAAK,CAAA;QAChC,QAAQ,IAAI,EAAE,CAAC;YACb,KAAK,UAAU,CAAC,KAAK,CAAC,CAAC,OAAO,WAAW,CAAC,SAAS,EAAE,GAAG,EAAE,GAAG,CAAC,CAAA;YAC9D,KAAK,UAAU,CAAC,OAAO,CAAC,CAAC,OAAO,SAAS,CAAC,SAAS,EAAE,GAAG,EAAE,GAAG,CAAC,CAAA;YAC9D,KAAK,UAAU,CAAC,gBAAgB,CAAC,CAAC,OAAO,kBAAkB,CAAC,SAAS,EAAE,GAAG,EAAE,GAAG,CAAC,CAAA;QAClF,CAAC;IACH,CAAC;AACH,CAAC"}
@@ -0,0 +1,4 @@
1
+ import { NonEmptyArray } from 'justypes';
2
+ import { IRandomNumberGenerator } from './types.js';
3
+ export declare function randomPickIndex(items: NonEmptyArray<unknown>): number;
4
+ export declare function randomPickIndex(generator: IRandomNumberGenerator, items: NonEmptyArray<unknown>): number;
@@ -0,0 +1,15 @@
1
+ import { nativeRandomNumberGenerator } from './native-random-number-generator.js';
2
+ import { randomInt } from './random-int.js';
3
+ export function randomPickIndex(...args) {
4
+ let generator;
5
+ let items;
6
+ if (args.length === 1) {
7
+ generator = nativeRandomNumberGenerator;
8
+ [items] = args;
9
+ }
10
+ else {
11
+ [generator, items] = args;
12
+ }
13
+ return randomInt(generator, 0, items.length);
14
+ }
15
+ //# sourceMappingURL=random-pick-index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"random-pick-index.js","sourceRoot":"","sources":["../src/random-pick-index.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,2BAA2B,EAAE,MAAM,qCAAqC,CAAA;AACjF,OAAO,EAAE,SAAS,EAAE,MAAM,iBAAiB,CAAA;AAO3C,MAAM,UAAU,eAAe,CAAC,GAAG,IAEiC;IAElE,IAAI,SAAiC,CAAA;IACrC,IAAI,KAA6B,CAAA;IAEjC,IAAI,IAAI,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QACtB,SAAS,GAAG,2BAA2B,CACtC;QAAA,CAAC,KAAK,CAAC,GAAG,IAAI,CAAA;IACjB,CAAC;SAAM,CAAC;QACN,CAAC,SAAS,EAAE,KAAK,CAAC,GAAG,IAAI,CAAA;IAC3B,CAAC;IAED,OAAO,SAAS,CAAC,SAAS,EAAE,CAAC,EAAE,KAAK,CAAC,MAAM,CAAC,CAAA;AAC9C,CAAC"}
@@ -0,0 +1,4 @@
1
+ import { NonEmptyArray } from 'justypes';
2
+ import { IRandomNumberGenerator } from './types.js';
3
+ export declare function randomPickItem<T>(items: NonEmptyArray<T>): T;
4
+ export declare function randomPickItem<T>(generator: IRandomNumberGenerator, items: NonEmptyArray<T>): T;
@@ -0,0 +1,16 @@
1
+ import { nativeRandomNumberGenerator } from './native-random-number-generator.js';
2
+ import { randomPickIndex } from './random-pick-index.js';
3
+ export function randomPickItem(...args) {
4
+ let generator;
5
+ let items;
6
+ if (args.length === 1) {
7
+ generator = nativeRandomNumberGenerator;
8
+ [items] = args;
9
+ }
10
+ else {
11
+ [generator, items] = args;
12
+ }
13
+ const index = randomPickIndex(generator, items);
14
+ return items[index];
15
+ }
16
+ //# sourceMappingURL=random-pick-item.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"random-pick-item.js","sourceRoot":"","sources":["../src/random-pick-item.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,2BAA2B,EAAE,MAAM,qCAAqC,CAAA;AACjF,OAAO,EAAE,eAAe,EAAE,MAAM,wBAAwB,CAAA;AAOxD,MAAM,UAAU,cAAc,CAAI,GAAG,IAEyB;IAE5D,IAAI,SAAiC,CAAA;IACrC,IAAI,KAAuB,CAAA;IAE3B,IAAI,IAAI,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QACtB,SAAS,GAAG,2BAA2B,CACtC;QAAA,CAAC,KAAK,CAAC,GAAG,IAAI,CAAA;IACjB,CAAC;SAAM,CAAC;QACN,CAAC,SAAS,EAAE,KAAK,CAAC,GAAG,IAAI,CAAA;IAC3B,CAAC;IAED,MAAM,KAAK,GAAG,eAAe,CAAC,SAAS,EAAE,KAAK,CAAC,CAAA;IAC/C,OAAO,KAAK,CAAC,KAAK,CAAC,CAAA;AACrB,CAAC"}
@@ -0,0 +1,4 @@
1
+ import { NonEmptyArray } from 'justypes';
2
+ import { IRandomNumberGenerator } from './types.js';
3
+ export declare function randomPickWeightedIndex(weights: NonEmptyArray<number>): number;
4
+ export declare function randomPickWeightedIndex(generator: IRandomNumberGenerator, weights: NonEmptyArray<number>): number;
@@ -0,0 +1,15 @@
1
+ import { remapToWeightedIndex } from 'extra-utils';
2
+ import { nativeRandomNumberGenerator } from './native-random-number-generator.js';
3
+ export function randomPickWeightedIndex(...args) {
4
+ let generator;
5
+ let weights;
6
+ if (args.length === 1) {
7
+ generator = nativeRandomNumberGenerator;
8
+ [weights] = args;
9
+ }
10
+ else {
11
+ [generator, weights] = args;
12
+ }
13
+ return remapToWeightedIndex(generator.next(), [0, 1], weights);
14
+ }
15
+ //# sourceMappingURL=random-pick-weighted-index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"random-pick-weighted-index.js","sourceRoot":"","sources":["../src/random-pick-weighted-index.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,oBAAoB,EAAE,MAAM,aAAa,CAAA;AAElD,OAAO,EAAE,2BAA2B,EAAE,MAAM,qCAAqC,CAAA;AAOjF,MAAM,UAAU,uBAAuB,CAAC,GAAG,IAE0B;IAEnE,IAAI,SAAiC,CAAA;IACrC,IAAI,OAA8B,CAAA;IAElC,IAAI,IAAI,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QACtB,SAAS,GAAG,2BAA2B,CACtC;QAAA,CAAC,OAAO,CAAC,GAAG,IAAI,CAAA;IACnB,CAAC;SAAM,CAAC;QACN,CAAC,SAAS,EAAE,OAAO,CAAC,GAAG,IAAI,CAAA;IAC7B,CAAC;IAED,OAAO,oBAAoB,CACzB,SAAS,CAAC,IAAI,EAAE,EAChB,CAAC,CAAC,EAAE,CAAC,CAAC,EACN,OAAO,CACR,CAAA;AACH,CAAC"}
@@ -0,0 +1,7 @@
1
+ import { NonEmptyArray } from 'justypes';
2
+ import { IRandomNumberGenerator } from './types.js';
3
+ export interface IWeightedItem {
4
+ weight: number;
5
+ }
6
+ export declare function randomPickWeightedItem<T extends IWeightedItem>(items: NonEmptyArray<T>): T;
7
+ export declare function randomPickWeightedItem<T extends IWeightedItem>(generator: IRandomNumberGenerator, items: NonEmptyArray<T>): T;
@@ -0,0 +1,17 @@
1
+ import { randomPickWeightedIndex } from './random-pick-weighted-index.js';
2
+ import { nativeRandomNumberGenerator } from './native-random-number-generator.js';
3
+ export function randomPickWeightedItem(...args) {
4
+ let generator;
5
+ let items;
6
+ if (args.length === 1) {
7
+ generator = nativeRandomNumberGenerator;
8
+ [items] = args;
9
+ }
10
+ else {
11
+ [generator, items] = args;
12
+ }
13
+ const weights = items.map(option => option.weight);
14
+ const index = randomPickWeightedIndex(generator, weights);
15
+ return items[index];
16
+ }
17
+ //# sourceMappingURL=random-pick-weighted-item.js.map
@@ -0,0 +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;AAWjF,MAAM,UAAU,sBAAsB,CAA0B,GAAG,IAEL;IAE5D,IAAI,SAAiC,CAAA;IACrC,IAAI,KAAuB,CAAA;IAE3B,IAAI,IAAI,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QACtB,SAAS,GAAG,2BAA2B,CACtC;QAAA,CAAC,KAAK,CAAC,GAAG,IAAI,CAAA;IACjB,CAAC;SAAM,CAAC;QACN,CAAC,SAAS,EAAE,KAAK,CAAC,GAAG,IAAI,CAAA;IAC3B,CAAC;IAED,MAAM,OAAO,GAAG,KAAK,CAAC,GAAG,CAAC,MAAM,CAAC,EAAE,CAAC,MAAM,CAAC,MAAM,CAA0B,CAAA;IAC3E,MAAM,KAAK,GAAG,uBAAuB,CAAC,SAAS,EAAE,OAAO,CAAC,CAAA;IACzD,OAAO,KAAK,CAAC,KAAK,CAAC,CAAA;AACrB,CAAC"}
package/lib/shuffle.js CHANGED
@@ -1,10 +1,10 @@
1
- import { NativeRandomNumberGenerator } from './native-random-number-generator.js';
1
+ import { nativeRandomNumberGenerator } from './native-random-number-generator.js';
2
2
  import { randomInt } from './random-int.js';
3
3
  export function shuffle(...args) {
4
4
  let generator;
5
5
  let arr;
6
6
  if (args.length === 1) {
7
- generator = NativeRandomNumberGenerator;
7
+ generator = nativeRandomNumberGenerator;
8
8
  [arr] = args;
9
9
  }
10
10
  else {
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "extra-rand",
3
- "version": "0.3.2",
3
+ "version": "0.4.0",
4
4
  "description": "Yet another random library",
5
5
  "keywords": [
6
6
  "random"
@@ -54,7 +54,7 @@
54
54
  },
55
55
  "dependencies": {
56
56
  "@blackglory/errors": "^3.0.3",
57
- "extra-utils": "^5.7.0",
57
+ "extra-utils": "^5.15.0",
58
58
  "justypes": "^4.2.1"
59
59
  }
60
60
  }
package/src/index.ts CHANGED
@@ -1,14 +1,12 @@
1
1
  export * from './types.js'
2
2
 
3
- export * from './random.js'
3
+ export * from './random-float.js'
4
4
  export * from './random-int.js'
5
5
  export * from './random-int-inclusive.js'
6
+ export * from './random-number.js'
6
7
  export * from './random-bool.js'
7
- export * from './random-index-by-weight.js'
8
- export * from './random-weighted.js'
9
- export * from './random-by-weight-model.js'
10
- export * from './random-by-model.js'
8
+ export * from './random-pick-item.js'
9
+ export * from './random-pick-weighted-item.js'
10
+ export * from './random-pick-index.js'
11
+ export * from './random-pick-weighted-index.js'
11
12
  export * from './shuffle.js'
12
-
13
- export * from './map-to-range.js'
14
- export * from './map-to-index-by-weight.js'
@@ -1,5 +1,5 @@
1
1
  import { IRandomNumberGenerator } from './types.js'
2
2
 
3
- export const NativeRandomNumberGenerator: IRandomNumberGenerator = {
3
+ export const nativeRandomNumberGenerator: IRandomNumberGenerator = {
4
4
  next: Math.random
5
5
  }
@@ -1,6 +1,6 @@
1
1
  import { IRandomNumberGenerator } from './types.js'
2
- import { NativeRandomNumberGenerator } from './native-random-number-generator.js'
3
- import { random } from './random.js'
2
+ import { nativeRandomNumberGenerator } from './native-random-number-generator.js'
3
+ import { randomFloat } from './random-float.js'
4
4
 
5
5
  export function randomBool(probabilityOfTrue: number): boolean
6
6
  export function randomBool(
@@ -15,11 +15,11 @@ export function randomBool(...args:
15
15
  let probabilityOfTrue: number
16
16
 
17
17
  if (args.length === 1) {
18
- generator = NativeRandomNumberGenerator
18
+ generator = nativeRandomNumberGenerator
19
19
  ;[probabilityOfTrue] = args
20
20
  } else {
21
21
  [generator, probabilityOfTrue] = args
22
22
  }
23
23
 
24
- return random(generator, 0, 1) < probabilityOfTrue
24
+ return randomFloat(generator, 0, 1) < probabilityOfTrue
25
25
  }
@@ -1,14 +1,14 @@
1
- import { mapToRange } from './map-to-range.js'
1
+ import { remap } from 'extra-utils'
2
2
  import { IRandomNumberGenerator } from './types.js'
3
- import { NativeRandomNumberGenerator } from './native-random-number-generator.js'
3
+ import { nativeRandomNumberGenerator } from './native-random-number-generator.js'
4
4
 
5
- export function random(min: number, max: number): number
6
- export function random(
5
+ export function randomFloat(min: number, max: number): number
6
+ export function randomFloat(
7
7
  generator: IRandomNumberGenerator
8
8
  , min: number
9
9
  , max: number
10
10
  ): number
11
- export function random(...args:
11
+ export function randomFloat(...args:
12
12
  | [min: number, max: number]
13
13
  | [generator: IRandomNumberGenerator, min: number, max: number]
14
14
  ): number {
@@ -17,15 +17,15 @@ export function random(...args:
17
17
  let max: number
18
18
 
19
19
  if (args.length === 2) {
20
- generator = NativeRandomNumberGenerator
20
+ generator = nativeRandomNumberGenerator
21
21
  ;[min, max] = args
22
22
  } else {
23
23
  [generator, min, max] = args
24
24
  }
25
25
 
26
- return mapToRange(
26
+ return remap(
27
27
  generator.next()
28
- , 0, 1
29
- , min, max
28
+ , [0, 1]
29
+ , [min, max]
30
30
  )
31
31
  }