Skip to content

Commit

Permalink
refactor: fix environment variable logic and support specifying the b…
Browse files Browse the repository at this point in the history
…ase PRNG
  • Loading branch information
kgryte committed Oct 4, 2024
1 parent 2a94c9e commit 3c0879e
Show file tree
Hide file tree
Showing 10 changed files with 192 additions and 63 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -90,11 +90,11 @@ The returned [iterator][mdn-iterator-protocol] protocol-compliant object has the
<!-- eslint no-undef: "error" -->

```javascript
var uniform = require( '@stdlib/random/iter/uniform' );
var random = require( '@stdlib/random/iter/{{BASE_PRNG}}' );
var {{ALIAS}} = require( '@{{PKG}}' );

// Create a seeded iterator for generating pseudorandom numbers:
var rand = uniform( {{RAND_MIN}}, {{RAND_MAX}}, {
var rand = random( {{RAND_MIN}}, {{RAND_MAX}}, {
'seed': 1234,
'iter': 10
});
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -21,7 +21,7 @@
// MODULES //

var bench = require( '@stdlib/bench' );
var uniform = require( '@stdlib/random/iter/uniform' );
var random = require( '@stdlib/random/iter/{{BASE_PRNG}}' );
var isnan = require( '@stdlib/math/base/assert/is-nan' );
var isIteratorLike = require( '@stdlib/assert/is-iterator-like' );
var pkg = require( './../package.json' ).name;
Expand All @@ -35,7 +35,7 @@ bench( pkg, function benchmark( b ) {
var iter;
var i;

rand = uniform( {{RAND_MIN}}, {{RAND_MAX}} );
rand = random( {{RAND_MIN}}, {{RAND_MAX}} );

b.tic();
for ( i = 0; i < b.iterations; i++ ) {
Expand All @@ -58,7 +58,7 @@ bench( pkg+'::iteration', function benchmark( b ) {
var z;
var i;

rand = uniform( {{RAND_MIN}}, {{RAND_MAX}} );
rand = random( {{RAND_MIN}}, {{RAND_MAX}} );
iter = {{ALIAS}}( rand );

b.tic();
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -25,7 +25,7 @@

Examples
--------
> var r = {{alias:@stdlib/random/iter/uniform}}( {{RAND_MIN}}, {{RAND_MAX}} );
> var r = {{alias:@stdlib/random/iter/{{BASE_PRNG}}}}( {{RAND_MIN}}, {{RAND_MAX}} );
> var it = {{alias}}( r );
> var v = it.next().value
<number>
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -20,7 +20,7 @@

/// <reference types="@stdlib/types"/>

import { TypedIterator as Iter, TypedIterableIterator } from '@stdlib/types/iter';
import { TypedIterator as Iter, TypedIterableIterator as IterableIterator } from '@stdlib/types/iter';

// Define a union type representing both iterable and non-iterable iterators:
type Iterator<T> = Iter<T> | IterableIterator<T>;
Expand All @@ -36,9 +36,9 @@ type Iterator<T> = Iter<T> | IterableIterator<T>;
* @returns iterator
*
* @example
* var uniform = require( `@stdlib/random/iter/uniform` );
* var random = require( `@stdlib/random/iter/{{BASE_PRNG}}` );
*
* var iter = {{ALIAS}}( uniform( {{RAND_MIN}}, {{RAND_MAX}} ) );
* var iter = {{ALIAS}}( random( {{RAND_MIN}}, {{RAND_MAX}} ) );
*
* var v = iter.next().value;
* // returns <number>
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -18,11 +18,11 @@

'use strict';

var uniform = require( '@stdlib/random/iter/uniform' );
var random = require( '@stdlib/random/iter/{{BASE_PRNG}}' );
var {{ALIAS}} = require( './../lib' );

// Create a seeded iterator for generating pseudorandom numbers:
var rand = uniform( {{RAND_MIN}}, {{RAND_MAX}}, {
var rand = random( {{RAND_MIN}}, {{RAND_MAX}}, {
'seed': 1234,
'iter': 10
});
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -24,10 +24,10 @@
* @module @{{PKG}}
*
* @example
* var uniform = require( '@stdlib/random/iter/uniform' );
* var random = require( '@stdlib/random/iter/{{BASE_PRNG}}' );
* var {{ALIAS}} = require( '@{{PKG}}' );
*
* var iter = {{ALIAS}}( uniform( {{RAND_MIN}}, {{RAND_MAX}} ) );
* var iter = {{ALIAS}}( random( {{RAND_MIN}}, {{RAND_MAX}} ) );
*
* var v = iter.next().value;
* // returns <number>
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -38,9 +38,9 @@ var {{UNARY_ALIAS}} = require( '@{{UNARY_PKG}}' );
* @returns {Iterator} iterator
*
* @example
* var uniform = require( '@stdlib/random/iter/uniform' );
* var random = require( '@stdlib/random/iter/{{BASE_PRNG}}' );
*
* var iter = {{ALIAS}}( uniform( {{RAND_MIN}}, {{RAND_MAX}} ) );
* var iter = {{ALIAS}}( random( {{RAND_MIN}}, {{RAND_MAX}} ) );
*
* var v = iter.next().value;
* // returns <number>
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -21,8 +21,7 @@
// MODULES //

var tape = require( 'tape' );
var uniform = require( '@stdlib/random/iter/uniform' );
var linspace = require( '@stdlib/iter/linspace' );
var random = require( '@stdlib/random/iter/{{BASE_PRNG}}' );
var array2iterator = require( '@stdlib/array/to-iterator' );
var {{UNARY_ALIAS}} = require( '@{{UNARY_PKG}}' );
var {{ALIAS}} = require( './../lib' );
Expand Down Expand Up @@ -66,11 +65,15 @@ tape( 'the function throws an error if provided an iterator argument which is no
});

tape( 'the function returns an iterator protocol-compliant object', function test( t ) {
var rand;
var it;
var r;
var i;

it = {{ALIAS}}( uniform( {{RAND_MIN}}, {{RAND_MAX}} ) );
rand = random( {{RAND_MIN}}, {{RAND_MAX}}, {
'seed': 1234
});
it = {{ALIAS}}( rand );
t.equal( it.next.length, 0, 'has zero arity' );

for ( i = 0; i < 100; i++ ) {
Expand All @@ -83,17 +86,26 @@ tape( 'the function returns an iterator protocol-compliant object', function tes

tape( 'the function returns an iterator protocol-compliant object which {{TEST_DESC}}', function test( t ) {
var expected;
var rand;
var it;
var N;
var x;
var r;
var i;

N = 100;
it = {{ALIAS}}( linspace( {{RAND_MIN}}, {{RAND_MAX}}, N ) );

rand = random( {{RAND_MIN}}, {{RAND_MAX}}, {
'seed': 1234,
'iter': N
});
it = {{ALIAS}}( rand );
t.equal( it.next.length, 0, 'has zero arity' );

x = linspace( {{RAND_MIN}}, {{RAND_MAX}}, N );
x = random( {{RAND_MIN}}, {{RAND_MAX}}, {
'seed': 1234,
'iter': N
});
for ( i = 0; i < N; i++ ) {
r = it.next();
expected = {{UNARY_ALIAS}}( x.next().value );
Expand Down Expand Up @@ -166,7 +178,7 @@ tape( 'the returned iterator has a `return` method for closing an iterator (no a
var it;
var r;

it = {{ALIAS}}( uniform( {{RAND_MIN}}, {{RAND_MAX}} ) );
it = {{ALIAS}}( random( {{RAND_MIN}}, {{RAND_MAX}} ) );

r = it.next();
t.equal( typeof r.value, 'number', 'returns expected value' );
Expand All @@ -191,7 +203,7 @@ tape( 'the returned iterator has a `return` method for closing an iterator (argu
var it;
var r;

it = {{ALIAS}}( uniform( {{RAND_MIN}}, {{RAND_MAX}} ) );
it = {{ALIAS}}( random( {{RAND_MIN}}, {{RAND_MAX}} ) );

r = it.next();
t.equal( typeof r.value, 'number', 'returns expected value' );
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -40,6 +40,120 @@ var SCAFFOLD_SCRIPT = resolve( __dirname, 'scaffold.sh' );
var ROOT_DIR = resolve( rootDir(), 'lib', 'node_modules' );


// FUNCTIONS //

/**
* Returns an `ALIAS` environment variable string.
*
* @private
* @param {string} alias - package alias
* @returns {string} environment variable string
*
* @example
* var s = aliasEnvVar( 'abs' );
* // returns 'ALIAS=iterAbs'
*
* @example
* var s = aliasEnvVar( 'absf' );
* // returns 'ALIAS=iterAbsf'
*/
function aliasEnvVar( alias ) {
return 'ALIAS=iter' + capitalize( alias );
}

/**
* Returns a `DESC` environment variable string.
*
* @private
* @param {string} desc - default description
* @returns {string} environment variable string
*
* @example
* var s = descEnvVar( 'computes the cube root' );
* // returns 'DESC=\'computes the cube root\''
*/
function descEnvVar( desc ) {
return 'DESC=\'' + desc + '\'';
}

/**
* Returns a `DESC_LINK_TEXT` environment variable string.
*
* @private
* @param {string} desc - short description
* @returns {string} environment variable string
*
* @example
* var s = linkTextEnvVar( 'cube root' );
* // returns 'DESC_LINK_TEXT=\'cube root\''
*
* @example
* var s = linkTextEnvVar( '' );
* // returns ''
*/
function linkTextEnvVar( desc ) {
if ( desc === '' ) {
return '';
}
return 'DESC_LINK_TEXT=\'' + desc + '\'';
}

/**
* Returns a `KEYWORDS` environment variable string.
*
* @private
* @param {StringArray} keywords - list of keywords
* @returns {string} environment variable string
*
* @example
* var keywords = [ 'math', 'special' ];
*
* var s = keywordsEnvVar( keywords );
* // returns 'KEYWORDS=\'math,special\''
*/
function keywordsEnvVar( keywords ) {
return 'KEYWORDS=\'' + keywords.join( ',' ) + '\'';
}

/**
* Returns a `VALUES_LEN_2` environment variable string.
*
* @private
* @param {NumberArray} values - example values
* @returns {string} environment variable string
*
* @example
* var values = [ 1, 2, 3, 4 ];
*
* var s = valuesEnvVar( values );
* // returns 'VALUES_LEN_2=\'1,2\''
*/
function valuesEnvVar( values ) {
return 'VALUES_LEN_2=\'' + values.slice( 0, 2 ).join( ',' ) + '\'';
}

/**
* Returns a string containing environment variable for generating pseudorandom numbers.
*
* @private
* @param {Object} obj - configuration object
* @returns {string} environment variable string
*
* @example
* var o = {
* 'prng': 'random/base/uniform',
* 'parameters': [ -10, 10 ]
* };
*
* var s = prngEnvVars( o );
* // returns 'BASE_PRNG=\'uniform\',RAND_MIN=-10,RAND_MAX=10'
*/
function prngEnvVars( obj ) {
var p = obj.prng.split( '/' );
return 'BASE_PRNG=\'' + p[ p.length-1 ] + '\',RAND_MIN=' + obj.parameters[ 0 ] +',RAND_MAX=' + obj.parameters[ 1 ];
}


// MAIN //

/**
Expand All @@ -48,7 +162,6 @@ var ROOT_DIR = resolve( rootDir(), 'lib', 'node_modules' );
* @private
*/
function main() {
var names;
var keys;
var envs;
var str;
Expand All @@ -60,9 +173,8 @@ function main() {
var i;
var j;

keys = objectKeys( DATA );
for ( i = 0; i < keys.length; i++ ) {
o = DATA[ keys[ i ] ];
for ( i = 0; i < DATA.length; i++ ) {
o = DATA[ i ];
p = resolve( ROOT_DIR, '@stdlib/math/iter/special', o.alias, 'package.json' );
if ( existsSync( p ) ) {
if ( CREATE_ONLY ) {
Expand All @@ -73,30 +185,32 @@ function main() {
} else {
log( 'Creating package: @%s...', 'stdlib/math/iter/special/' + o.alias );
}
names = [ 'base_alias', 'alias', 'pkg_desc', 'desc', 'example_values', 'rand', 'keywords' ];
keys = objectKeys( o );
envs = [];
for ( j = 0; j < names.length; j++ ) {
k = names[ j ];
for ( j = 0; j < keys.length; j++ ) {
k = keys[ j ];
v = o[ k ];
if ( k === 'example_values' ) {
envs.push( 'VALUES_LEN_2=\''+o.parameters[0].example_values.join(',')+'\'' );
if ( k === 'alias' ) {
envs.push( aliasEnvVar( v ) );
continue;
}
if ( k === 'desc' ) {
envs.push( descEnvVar( v ) );
continue;
} else if ( k === 'rand' ) {
envs.push( 'RAND_MIN='+o.parameters[0].rand.parameters[0] );
envs.push( 'RAND_MAX='+o.parameters[0].rand.parameters[1] );
}
if ( k === 'short_desc' ) {
envs.push( linkTextEnvVar( v ) );
continue;
} else if ( k === 'keywords' ) {
envs.push( 'KEYWORDS=\'' + o.keywords.join(',') + '\'' );
}
if ( k === 'keywords' ) {
envs.push( keywordsEnvVar( v ) );
continue;
} else if ( k === 'alias' ) {
envs.push( 'ALIAS=iter' + capitalize( v ) );
}
if ( k === 'parameters' ) {
envs.push( valuesEnvVar( v[ 0 ].parameters.example_values ) );
envs.push( prngEnvVars( v[ 0 ].parameters.rand ) );
continue;
} else {
str = uppercase( k );
str += '=';
str += '\'' + v + '\'';
}
envs.push( str );
}
cmd = envs.join( ' ' ) + ' . ' + SCAFFOLD_SCRIPT;
shell( cmd );
Expand Down
Loading

0 comments on commit 3c0879e

Please sign in to comment.