20
20
21
21
// MODULES //
22
22
23
- var defineProperty = require ( '@stdlib/utils/define-property' ) ;
24
23
var setReadOnly = require ( '@stdlib/utils/define-read-only-property' ) ;
24
+ var setReadOnlyAccessor = require ( '@stdlib/utils/define-read-only-accessor' ) ;
25
+ var setReadWriteAccessor = require ( '@stdlib/utils/define-read-write-accessor' ) ;
25
26
var isObject = require ( '@stdlib/assert/is-plain-object' ) ;
26
27
var gammaFactory = require ( '@stdlib/random/base/gamma' ) . factory ;
27
28
var isnan = require ( '@stdlib/math/base/assert/is-nan' ) ;
@@ -37,10 +38,14 @@ var betaprime0 = require( './betaprime.js' );
37
38
* @param {PositiveNumber } [alpha] - first shape parameter
38
39
* @param {PositiveNumber } [beta] - second shape parameter
39
40
* @param {Options } [options] - function options
40
- * @param {* } [options.seed] - pseudorandom number generator seed
41
+ * @param {(uinteger32|Collection<uinteger32>) } [options.seed] - pseudorandom number generator seed
42
+ * @param {Uint32Array } [options.state] - pseudorandom number generator state
43
+ * @param {boolean } [options.copy=true] - boolean indicating whether to copy a provided pseudorandom number generator state
41
44
* @throws {TypeError } `alpha` must be a positive number
42
45
* @throws {TypeError } `beta` must be a positive number
43
- * @throws {TypeError } `options` must be an object
46
+ * @throws {TypeError } options argument must be an object
47
+ * @throws {TypeError } must provide valid options
48
+ * @throws {Error } must provide a valid state
44
49
* @returns {Function } pseudorandom number generator
45
50
*
46
51
* @example
@@ -94,19 +99,55 @@ function factory() {
94
99
prng = betaprime1 ;
95
100
}
96
101
setReadOnly ( prng , 'NAME' , 'betaprime' ) ;
97
- setReadOnly ( prng , 'seed' , rand . seed ) ;
98
- defineProperty ( prng , 'state' , {
99
- 'configurable' : false ,
100
- 'enumerable' : true ,
101
- 'get' : getState ,
102
- 'set' : setState
103
- } ) ;
104
- setReadOnly ( prng , 'stateLength' , rand . stateLength ) ;
105
- setReadOnly ( prng , 'byteLength' , rand . byteLength ) ;
102
+ setReadOnlyAccessor ( prng , 'seed' , getSeed ) ;
103
+ setReadOnlyAccessor ( prng , 'seedLength' , getSeedLength ) ;
104
+ setReadWriteAccessor ( prng , 'state' , getState , setState ) ;
105
+ setReadOnlyAccessor ( prng , 'stateLength' , getStateLength ) ;
106
+ setReadOnlyAccessor ( prng , 'byteLength' , getStateSize ) ;
106
107
setReadOnly ( prng , 'PRNG' , rand ) ;
107
108
108
109
return prng ;
109
110
111
+ /**
112
+ * Returns the PRNG seed.
113
+ *
114
+ * @private
115
+ * @returns {Uint32Array } seed
116
+ */
117
+ function getSeed ( ) {
118
+ return rand . seed ;
119
+ }
120
+
121
+ /**
122
+ * Returns the PRNG seed length.
123
+ *
124
+ * @private
125
+ * @returns {PositiveInteger } seed length
126
+ */
127
+ function getSeedLength ( ) {
128
+ return rand . seedLength ;
129
+ }
130
+
131
+ /**
132
+ * Returns the PRNG state length.
133
+ *
134
+ * @private
135
+ * @returns {PositiveInteger } state length
136
+ */
137
+ function getStateLength ( ) {
138
+ return rand . stateLength ;
139
+ }
140
+
141
+ /**
142
+ * Returns the PRNG state size (in bytes).
143
+ *
144
+ * @private
145
+ * @returns {PositiveInteger } state size (in bytes)
146
+ */
147
+ function getStateSize ( ) {
148
+ return rand . byteLength ;
149
+ }
150
+
110
151
/**
111
152
* Returns the current pseudorandom number generator state.
112
153
*
@@ -122,6 +163,8 @@ function factory() {
122
163
*
123
164
* @private
124
165
* @param {Uint32Array } s - generator state
166
+ * @throws {TypeError } must provide a `Uint32Array`
167
+ * @throws {Error } must provide a valid state
125
168
*/
126
169
function setState ( s ) {
127
170
rand . state = s ;
0 commit comments