UNPKG

@stdlib/random-streams-minstd

Version:

Create a readable stream for a linear congruential pseudorandom number generator (LCG) based on Park and Miller.

421 lines (383 loc) 12.2 kB
/* * @license Apache-2.0 * * Copyright (c) 2021 The Stdlib Authors. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ // TypeScript Version: 4.1 /// <reference types="node"/> /// <reference types="@stdlib/types"/> import { Readable } from 'stream'; import * as random from '@stdlib/types/random'; /** * Interface defining stream options. */ interface Options { /** * Specifies whether a stream should operate in object mode (default: `false`). */ objectMode?: boolean; /** * Specifies how `Buffer` objects should be decoded to strings (default: `null`). */ encoding?: string | null; /** * Specifies the maximum number of bytes to store in an internal buffer before ceasing to generate additional pseudorandom numbers. */ highWaterMark?: number; /** * Separator used to join streamed data (default: `'\n'`). */ sep?: string; /** * Number of iterations. */ iter?: number; /** * Boolean indicating whether to return pseudorandom numbers on the interval `[0,1)` (default: `false`). */ normalized?: boolean; /** * Pseudorandom number generator seed. */ seed?: random.PRNGSeedMINSTD; /** * Pseudorandom number generator state. */ state?: random.PRNGStateMINSTD; /** * Specifies whether to copy a provided pseudorandom number generator state (default: `true`). */ copy?: boolean; /** * Number of iterations after which to emit the PRNG state. */ siter?: number; } /** * Class for creating readable streams which generate a stream of pseudorandom numbers via a linear congruential pseudorandom number generator (LCG) based on Park and Miller. */ declare class RandomStream extends Readable { /** * Returns a readable stream for generating a stream of pseudorandom numbers via a linear congruential pseudorandom number generator (LCG) based on Park and Miller. * * @param options - stream options * @throws must provide valid options * @throws must provide a valid state * @returns stream instance * * @example * var inspectStream = require( '@stdlib/streams-node-inspect-sink' ); * * function log( chunk ) { * console.log( chunk.toString() ); * } * * var opts = { * 'iter': 10 * }; * * var RandomStream = randomStream; * var stream = new RandomStream( opts ); * * stream.pipe( inspectStream( log ) ); */ constructor( options?: Options ); /** * Destruction state. */ private readonly _destroyed: boolean; /** * Flag indicating whether a stream is operating in object mode. */ private readonly _objectMode: boolean; /** * Data separator. */ private readonly _sep: string; /** * Total number of iterations. */ private readonly _iter: number; /** * Number of iterations after which to emit the underlying PRNG state. */ private readonly _siter: number; /** * Iteration counter. */ private _i: number; /** * Pseudorandom number generator for generating standard normally distributed pseudorandom numbers. */ private readonly _prng: random.PRNG; /** * Underlying PRNG. */ readonly PRNG: random.PRNG; /** * PRNG seed. */ readonly seed: random.PRNGSeedMINSTD; /** * PRNG seed length. */ readonly seedLength: number; /** * PRNG state. */ state: random.PRNGStateMINSTD; /** * PRNG state length. */ readonly stateLength: number; /** * PRNG state size (in bytes). */ readonly byteLength: number; /** * Implements the `_read` method. * * @param size - number (of bytes) to read */ _read( size: number ): void; /** * Gracefully destroys a stream, providing backward compatibility. * * @param error - error * * @example * var stream = new RandomStream(); * stream.on( 'error', onError ); * * function onError( err ) { * stream.destroy( err ); * } */ destroy( error?: Error ): void; } /** * Interface defining a stream constructor which is both "newable" and "callable". */ interface Constructor { /** * Stream constructor for generating a stream of pseudorandom numbers via a linear congruential pseudorandom number generator (LCG) based on Park and Miller. * * @param options - stream options * @param options.objectMode - specifies whether the stream should operate in object mode (default: false) * @param options.encoding - specifies how `Buffer` objects should be decoded to strings (default: null) * @param options.highWaterMark - specifies the maximum number of bytes to store in an internal buffer before ceasing to generate additional pseudorandom numbers * @param options.sep - separator used to join streamed data (default: '\n') * @param options.iter - number of iterations * @param options.normalized - boolean indicating whether to return pseudorandom numbers on the interval `[0,1)` (default: false) * @param options.seed - pseudorandom number generator seed * @param options.state - pseudorandom number generator state * @param options.copy - boolean indicating whether to copy a provided pseudorandom number generator state (default: true) * @param options.siter - number of iterations after which to emit the PRNG state * @throws must provide valid options * @throws must provide a valid state * @returns Stream instance * * @example * var inspectStream = require( '@stdlib/streams-node-inspect-sink' ); * * function log( chunk ) { * console.log( chunk.toString() ); * } * * var opts = { * 'iter': 10 * }; * * var RandomStream = randomStream; * var stream = new RandomStream( opts ); * * stream.pipe( inspectStream( log ) ); */ new( options?: Options ): RandomStream; // newable /** * Stream constructor for generating a stream of pseudorandom numbers via a linear congruential pseudorandom number generator (LCG) based on Park and Miller. * * @param options - stream options * @param options.objectMode - specifies whether the stream should operate in object mode (default: false) * @param options.encoding - specifies how `Buffer` objects should be decoded to strings (default: null) * @param options.highWaterMark - specifies the maximum number of bytes to store in an internal buffer before ceasing to generate additional pseudorandom numbers * @param options.sep - separator used to join streamed data (default: '\n') * @param options.iter - number of iterations * @param options.normalized - boolean indicating whether to return pseudorandom numbers on the interval `[0,1)` (default: false) * @param options.seed - pseudorandom number generator seed * @param options.state - pseudorandom number generator state * @param options.copy - boolean indicating whether to copy a provided pseudorandom number generator state (default: true) * @param options.siter - number of iterations after which to emit the PRNG state * @throws must provide valid options * @throws must provide a valid state * @returns Stream instance * * @example * var inspectStream = require( '@stdlib/streams-node-inspect-sink' ); * * function log( chunk ) { * console.log( chunk.toString() ); * } * * var opts = { * 'iter': 10 * }; * * var stream = randomStream( opts ); * * stream.pipe( inspectStream( log ) ); */ ( options?: Options ): RandomStream; // callable /** * Returns a function for creating readable streams which generate pseudorandom numbers via a linear congruential pseudorandom number generator (LCG) based on Park and Miller. * * @param options - stream options * @param options.objectMode - specifies whether a stream should operate in object mode (default: false) * @param options.encoding - specifies how `Buffer` objects should be decoded to `strings` (default: null) * @param options.highWaterMark - specifies the maximum number of bytes to store in an internal buffer before ceasing to generate additional pseudorandom numbers * @param options.sep - separator used to join streamed data (default: '\n') * @param options.iter - number of iterations * @param options.normalized - boolean indicating whether to return pseudorandom numbers on the interval `[0,1)` (default: false) * @param options.seed - pseudorandom number generator seed * @param options.state - pseudorandom number generator state * @param options.copy - boolean indicating whether to copy a provided pseudorandom number generator state (default: true) * @param options.siter - number of iterations after which to emit the PRNG state * @returns stream factory * * @example * var opts = { * 'sep': ',', * 'objectMode': false, * 'encoding': 'utf8', * 'highWaterMark': 64 * }; * * var createStream = randomStream.factory( opts ); * * // Create 10 identically configured streams... * var streams = []; * var i; * for ( i = 0; i < 10; i++ ) { * streams.push( createStream() ); * } */ factory( options?: Options ): () => RandomStream; /** * Returns an "objectMode" readable stream for generating pseudorandom numbers via a linear congruential pseudorandom number generator (LCG) based on Park and Miller. * * @param options - stream options * @param options.encoding - specifies how `Buffer` objects should be decoded to `strings` (default: null) * @param options.highWaterMark - specifies the maximum number of objects to store in an internal buffer before ceasing to generate additional pseudorandom numbers * @param options.iter - number of iterations * @param options.normalized - boolean indicating whether to return pseudorandom numbers on the interval `[0,1)` (default: false) * @param options.seed - pseudorandom number generator seed * @param options.state - pseudorandom number generator state * @param options.copy - boolean indicating whether to copy a provided pseudorandom number generator state (default: true) * @param options.siter - number of iterations after which to emit the PRNG state * @throws must provide valid options * @throws must provide a valid state * @returns Stream instance * * @example * var inspectStream = require( '@stdlib/streams-node-inspect-sink' ); * * function log( v ) { * console.log( v ); * } * * var opts = { * 'iter': 10 * }; * * var stream = randomStream.objectMode( opts ); * * stream.pipe( inspectStream.objectMode( log ) ); */ objectMode( options?: Options ): RandomStream; } /** * Returns a readable stream for generating a stream of pseudorandom numbers via a linear congruential pseudorandom number generator (LCG) based on Park and Miller. * * @param options - stream options * @throws must provide valid options * @throws must provide a valid state * @returns stream instance * * @example * var inspectStream = require( '@stdlib/streams-node-inspect-sink' ); * * function log( chunk ) { * console.log( chunk.toString() ); * } * * var opts = { * 'iter': 10 * }; * * var RandomStream = randomStream; * var stream = new RandomStream( opts ); * * stream.pipe( inspectStream( log ) ); * * @example * var inspectStream = require( '@stdlib/streams-node-inspect-sink' ); * * function log( chunk ) { * console.log( chunk.toString() ); * } * * var opts = { * 'iter': 10 * }; * * var stream = randomStream( opts ); * * stream.pipe( inspectStream( log ) ); * * @example * var opts = { * 'sep': ',', * 'objectMode': false, * 'encoding': 'utf8', * 'highWaterMark': 64 * }; * * var createStream = randomStream.factory( opts ); * * // Create 10 identically configured streams... * var streams = []; * var i; * for ( i = 0; i < 10; i++ ) { * streams.push( createStream() ); * } * * @example * var inspectStream = require( '@stdlib/streams-node-inspect-sink' ); * * function log( v ) { * console.log( v ); * } * * var opts = { * 'iter': 10 * }; * * var stream = randomStream.objectMode( opts ); * * stream.pipe( inspectStream.objectMode( log ) ); */ declare var randomStream: Constructor; // EXPORTS // export = randomStream;