diff --git a/lib/node_modules/@stdlib/stats/base/snanmskrange/README.md b/lib/node_modules/@stdlib/stats/base/snanmskrange/README.md
index 015e40ce3bc4..ddf2b3a01e71 100644
--- a/lib/node_modules/@stdlib/stats/base/snanmskrange/README.md
+++ b/lib/node_modules/@stdlib/stats/base/snanmskrange/README.md
@@ -18,6 +18,8 @@ limitations under the License.
 
 -->
 
+<!-- lint disable maximum-heading-length -->
+
 # snanmskrange
 
 > Calculate the [range][range] of a single-precision floating-point strided array according to a mask, ignoring `NaN` values.
@@ -40,7 +42,7 @@ var snanmskrange = require( '@stdlib/stats/base/snanmskrange' );
 
 #### snanmskrange( N, x, strideX, mask, strideMask )
 
-Computes the [range][range] of a single-precision floating-point strided array `x` according to a `mask`, ignoring `NaN` values.
+Computes the [range][range] of a single-precision floating-point strided array according to a `mask`, ignoring `NaN` values.
 
 ```javascript
 var Float32Array = require( '@stdlib/array/float32' );
@@ -57,22 +59,20 @@ The function has the following parameters:
 
 -   **N**: number of indexed elements.
 -   **x**: input [`Float32Array`][@stdlib/array/float32].
--   **strideX**: index increment for `x`.
+-   **strideX**: stride length for `x`.
 -   **mask**: mask [`Uint8Array`][@stdlib/array/uint8]. If a `mask` array element is `0`, the corresponding element in `x` is considered valid and **included** in computation. If a `mask` array element is `1`, the corresponding element in `x` is considered invalid/missing and **excluded** from computation.
--   **strideMask**: index increment for `mask`.
+-   **strideMask**: stride length for `mask`.
 
-The `N` and `stride` parameters determine which elements are accessed at runtime. For example, to compute the [range][range] of every other element in `x`,
+The `N` and stride parameters determine which elements in the strided arrays are accessed at runtime. For example, to compute the [range][range] of every other element in `x`,
 
 ```javascript
 var Float32Array = require( '@stdlib/array/float32' );
 var Uint8Array = require( '@stdlib/array/uint8' );
-var floor = require( '@stdlib/math/base/special/floor' );
 
 var x = new Float32Array( [ 1.0, 2.0, -7.0, -2.0, 4.0, 3.0, 5.0, 6.0 ] );
 var mask = new Uint8Array( [ 0, 0, 0, 0, 0, 0, 1, 1 ] );
-var N = floor( x.length / 2 );
 
-var v = snanmskrange( N, x, 2, mask, 2 );
+var v = snanmskrange( 4, x, 2, mask, 2 );
 // returns 11.0
 ```
 
@@ -83,7 +83,6 @@ Note that indexing is relative to the first index. To introduce offsets, use [`t
 ```javascript
 var Float32Array = require( '@stdlib/array/float32' );
 var Uint8Array = require( '@stdlib/array/uint8' );
-var floor = require( '@stdlib/math/base/special/floor' );
 
 var x0 = new Float32Array( [ 2.0, 1.0, -2.0, -2.0, 3.0, 4.0, 5.0, 6.0 ] );
 var x1 = new Float32Array( x0.buffer, x0.BYTES_PER_ELEMENT*1 ); // start at 2nd element
@@ -91,9 +90,7 @@ var x1 = new Float32Array( x0.buffer, x0.BYTES_PER_ELEMENT*1 ); // start at 2nd
 var mask0 = new Uint8Array( [ 0, 0, 0, 0, 0, 0, 1, 1 ] );
 var mask1 = new Uint8Array( mask0.buffer, mask0.BYTES_PER_ELEMENT*1 ); // start at 2nd element
 
-var N = floor( x0.length / 2 );
-
-var v = snanmskrange( N, x1, 2, mask1, 2 );
+var v = snanmskrange( 4, x1, 2, mask1, 2 );
 // returns 6.0
 ```
 
@@ -117,18 +114,16 @@ The function has the following additional parameters:
 -   **offsetX**: starting index for `x`.
 -   **offsetMask**: starting index for `mask`.
 
-While [`typed array`][mdn-typed-array] views mandate a view offset based on the underlying `buffer`, the `offset` parameter supports indexing semantics based on a starting index. For example, to calculate the [range][range] for every other value in `x` starting from the second value
+While [`typed array`][mdn-typed-array] views mandate a view offset based on the underlying buffer, offset parameters support indexing semantics based on starting indices. For example, to calculate the [range][range] for every other element in `x` starting from the second element
 
 ```javascript
 var Float32Array = require( '@stdlib/array/float32' );
 var Uint8Array = require( '@stdlib/array/uint8' );
-var floor = require( '@stdlib/math/base/special/floor' );
 
 var x = new Float32Array( [ 2.0, 1.0, -2.0, -2.0, 3.0, 4.0, 5.0, 6.0 ] );
 var mask = new Uint8Array( [ 0, 0, 0, 0, 0, 0, 1, 1 ] );
-var N = floor( x.length / 2 );
 
-var v = snanmskrange.ndarray( N, x, 2, 1, mask, 2, 1 );
+var v = snanmskrange.ndarray( 4, x, 2, 1, mask, 2, 1 );
 // returns 6.0
 ```
 
@@ -153,31 +148,22 @@ var v = snanmskrange.ndarray( N, x, 2, 1, mask, 2, 1 );
 <!-- eslint no-undef: "error" -->
 
 ```javascript
-var randu = require( '@stdlib/random/base/randu' );
-var round = require( '@stdlib/math/base/special/round' );
-var Float32Array = require( '@stdlib/array/float32' );
-var Uint8Array = require( '@stdlib/array/uint8' );
+var uniform = require( '@stdlib/random/base/uniform' );
+var bernoulli = require( '@stdlib/random/base/bernoulli' );
+var filledarrayBy = require( '@stdlib/array/filled-by' );
 var snanmskrange = require( '@stdlib/stats/base/snanmskrange' );
 
-var mask;
-var x;
-var i;
-
-x = new Float32Array( 10 );
-mask = new Uint8Array( x.length );
-for ( i = 0; i < x.length; i++ ) {
-    if ( randu() < 0.2 ) {
-        mask[ i ] = 1;
-    } else {
-        mask[ i ] = 0;
-    }
-    if ( randu() < 0.1 ) {
-        x[ i ] = NaN;
-    } else {
-        x[ i ] = round( (randu()*100.0) - 50.0 );
+function rand() {
+    if ( bernoulli( 0.8 ) < 1 ) {
+        return NaN;
     }
+    return uniform( -50.0, 50.0 );
 }
+
+var x = filledarrayBy( 10, 'float32', rand );
 console.log( x );
+
+var mask = filledarrayBy( x.length, 'uint8', bernoulli.factory( 0.2 ) );
 console.log( mask );
 
 var v = snanmskrange( x.length, x, 1, mask, 1 );
@@ -188,6 +174,145 @@ console.log( v );
 
 <!-- /.examples -->
 
+<!-- C interface documentation. -->
+
+* * *
+
+<section class="c">
+
+## C APIs
+
+<!-- Section to include introductory text. Make sure to keep an empty line after the intro `section` element and another before the `/section` close. -->
+
+<section class="intro">
+
+</section>
+
+<!-- /.intro -->
+
+<!-- C usage documentation. -->
+
+<section class="usage">
+
+### Usage
+
+```c
+#include "stdlib/stats/base/snanmskrange.h"
+```
+
+#### stdlib_strided_snanmskrange( N, \*X, strideX, \*Mask, strideMask )
+
+Computes the [range][range] of a single-precision floating-point strided array according to a `mask`, ignoring `NaN` values.
+
+```c
+#include <stdint.h>
+
+const float x[] = { 1.0f, -2.0f, 4.0f, 2.0f, 0.0f/0.0f };
+const uint8_t mask[] = { 0, 0, 1, 0, 0 };
+
+float v = stdlib_strided_snanmskrange( 5, x, 1, mask, 1 );
+// returns 4.0f
+```
+
+The function accepts the following arguments:
+
+-   **N**: `[in] CBLAS_INT` number of indexed elements.
+-   **X**: `[in] float*` input array.
+-   **strideX**: `[in] CBLAS_INT` stride length for `X`.
+-   **Mask**: `[in] uint8_t*` mask array. If a `Mask` array element is `0`, the corresponding element in `X` is considered valid and included in computation. If a `Mask` array element is `1`, the corresponding element in `X` is considered invalid/missing and excluded from computation.
+-   **strideMask**: `[in] CBLAS_INT` stride length for `Mask`.
+
+```c
+float stdlib_strided_snanmskrange( const CBLAS_INT N, const float *X, const CBLAS_INT strideX, const uint8_t *Mask, const CBLAS_INT strideMask );
+```
+
+#### stdlib_strided_snanmskrange_ndarray( N, \*X, strideX, offsetX, \*Mask, strideMask, offsetMask )
+
+Computes the [range][range] of a single-precision floating-point strided array according to a `mask`, ignoring `NaN` values and using alternative indexing semantics.
+
+```c
+#include <stdint.h>
+
+const float x[] = { 1.0f, -2.0f, 4.0f, 2.0f, 0.0f/0.0f };
+const uint8_t mask[] = { 0, 0, 1, 0, 0 };
+
+float v = stdlib_strided_snanmskrange_ndarray( 5, x, 1, 0, mask, 1, 0 );
+// returns 4.0f
+```
+
+The function accepts the following arguments:
+
+-   **N**: `[in] CBLAS_INT` number of indexed elements.
+-   **X**: `[in] float*` input array.
+-   **strideX**: `[in] CBLAS_INT` stride length for `X`.
+-   **offsetX**: `[in] CBLAS_INT` starting index for `X`.
+-   **Mask**: `[in] uint8_t*` mask array. If a `Mask` array element is `0`, the corresponding element in `X` is considered valid and included in computation. If a `Mask` array element is `1`, the corresponding element in `X` is considered invalid/missing and excluded from computation.
+-   **strideMask**: `[in] CBLAS_INT` stride length for `Mask`.
+-   **offsetMask**: `[in] CBLAS_INT` starting index for `Mask`.
+
+```c
+float stdlib_strided_snanmskrange_ndarray( const CBLAS_INT N, const float *X, const CBLAS_INT strideX, const CBLAS_INT offsetX, const uint8_t *Mask, const CBLAS_INT strideMask, const CBLAS_INT offsetMask );
+```
+
+</section>
+
+<!-- /.usage -->
+
+<!-- C API usage notes. Make sure to keep an empty line after the `section` element and another before the `/section` close. -->
+
+<section class="notes">
+
+</section>
+
+<!-- /.notes -->
+
+<!-- C API usage examples. -->
+
+<section class="examples">
+
+### Examples
+
+```c
+#include "stdlib/stats/base/snanmskrange.h"
+#include <stdint.h>
+#include <stdio.h>
+
+int main( void ) {
+    // Create a strided array:
+    const float x[] = { 1.0f, 2.0f, 3.0f, 4.0f, 5.0f, 6.0f, 7.0f, 8.0f, 0.0f/0.0f, 0.0f/0.0f };
+
+    // Create a mask array:
+    const uint8_t mask[] = { 0, 0, 0, 0, 0, 0, 0, 0, 1, 1 };
+
+    // Specify the number of elements:
+    const int N = 5;
+
+    // Specify the stride lengths:
+    const int strideX = 2;
+    const int strideMask = 2;
+
+    // Compute the range:
+    float v = stdlib_strided_snanmskrange( N, x, strideX, mask, strideMask );
+
+    // Print the result:
+    printf( "range: %f\n", v );
+}
+```
+
+</section>
+
+<!-- /.examples -->
+
+</section>
+
+<!-- /.c -->
+
+<section class="references">
+
+</section>
+
+<!-- /.references -->
+
 <!-- Section for related `stdlib` packages. Do not manually edit this section, as it is automatically populated. -->
 
 <section class="related">
diff --git a/lib/node_modules/@stdlib/stats/base/snanmskrange/benchmark/benchmark.js b/lib/node_modules/@stdlib/stats/base/snanmskrange/benchmark/benchmark.js
index bc5fb63918a4..5fa177f7364f 100644
--- a/lib/node_modules/@stdlib/stats/base/snanmskrange/benchmark/benchmark.js
+++ b/lib/node_modules/@stdlib/stats/base/snanmskrange/benchmark/benchmark.js
@@ -21,17 +21,30 @@
 // MODULES //
 
 var bench = require( '@stdlib/bench' );
-var randu = require( '@stdlib/random/base/randu' );
+var uniform = require( '@stdlib/random/base/uniform' );
+var bernoulli = require( '@stdlib/random/base/bernoulli' );
+var filledarrayBy = require( '@stdlib/array/filled-by' );
 var isnanf = require( '@stdlib/math/base/assert/is-nanf' );
 var pow = require( '@stdlib/math/base/special/pow' );
-var Float32Array = require( '@stdlib/array/float32' );
-var Uint8Array = require( '@stdlib/array/uint8' );
 var pkg = require( './../package.json' ).name;
 var snanmskrange = require( './../lib/snanmskrange.js' );
 
 
 // FUNCTIONS //
 
+/**
+* Returns a random value or `NaN`.
+*
+* @private
+* @returns {number} random number or `NaN`
+*/
+function rand() {
+	if ( bernoulli( 0.8 ) < 1 ) {
+		return NaN;
+	}
+	return uniform( -10.0, 10.0 );
+}
+
 /**
 * Creates a benchmark function.
 *
@@ -42,18 +55,9 @@ var snanmskrange = require( './../lib/snanmskrange.js' );
 function createBenchmark( len ) {
 	var mask;
 	var x;
-	var i;
 
-	x = new Float32Array( len );
-	mask = new Uint8Array( len );
-	for ( i = 0; i < x.length; i++ ) {
-		if ( randu() < 0.2 ) {
-			mask[ i ] = 1;
-		} else {
-			mask[ i ] = 0;
-		}
-		x[ i ] = ( randu()*20.0 ) - 10.0;
-	}
+	x = filledarrayBy( len, 'float32', rand );
+	mask = filledarrayBy( len, 'uint8', bernoulli.factory( 0.2 ) );
 	return benchmark;
 
 	function benchmark( b ) {
diff --git a/lib/node_modules/@stdlib/stats/base/snanmskrange/benchmark/benchmark.native.js b/lib/node_modules/@stdlib/stats/base/snanmskrange/benchmark/benchmark.native.js
index 380b5fccddd1..42ae14ee7cbc 100644
--- a/lib/node_modules/@stdlib/stats/base/snanmskrange/benchmark/benchmark.native.js
+++ b/lib/node_modules/@stdlib/stats/base/snanmskrange/benchmark/benchmark.native.js
@@ -22,11 +22,11 @@
 
 var resolve = require( 'path' ).resolve;
 var bench = require( '@stdlib/bench' );
-var randu = require( '@stdlib/random/base/randu' );
+var uniform = require( '@stdlib/random/base/uniform' );
+var bernoulli = require( '@stdlib/random/base/bernoulli' );
+var filledarrayBy = require( '@stdlib/array/filled-by' );
 var isnanf = require( '@stdlib/math/base/assert/is-nanf' );
 var pow = require( '@stdlib/math/base/special/pow' );
-var Float32Array = require( '@stdlib/array/float32' );
-var Uint8Array = require( '@stdlib/array/uint8' );
 var tryRequire = require( '@stdlib/utils/try-require' );
 var pkg = require( './../package.json' ).name;
 
@@ -41,6 +41,19 @@ var opts = {
 
 // FUNCTIONS //
 
+/**
+* Returns a random value or `NaN`.
+*
+* @private
+* @returns {number} random number or `NaN`
+*/
+function rand() {
+	if ( bernoulli( 0.8 ) < 1 ) {
+		return NaN;
+	}
+	return uniform( -10.0, 10.0 );
+}
+
 /**
 * Creates a benchmark function.
 *
@@ -51,18 +64,9 @@ var opts = {
 function createBenchmark( len ) {
 	var mask;
 	var x;
-	var i;
 
-	x = new Float32Array( len );
-	mask = new Uint8Array( len );
-	for ( i = 0; i < x.length; i++ ) {
-		if ( randu() < 0.2 ) {
-			mask[ i ] = 1;
-		} else {
-			mask[ i ] = 0;
-		}
-		x[ i ] = ( randu()*20.0 ) - 10.0;
-	}
+	x = filledarrayBy( len, 'float32', rand );
+	mask = filledarrayBy( len, 'uint8', bernoulli.factory( 0.2 ) );
 	return benchmark;
 
 	function benchmark( b ) {
diff --git a/lib/node_modules/@stdlib/stats/base/snanmskrange/benchmark/benchmark.ndarray.js b/lib/node_modules/@stdlib/stats/base/snanmskrange/benchmark/benchmark.ndarray.js
index 8de6638fbef2..42f929f00511 100644
--- a/lib/node_modules/@stdlib/stats/base/snanmskrange/benchmark/benchmark.ndarray.js
+++ b/lib/node_modules/@stdlib/stats/base/snanmskrange/benchmark/benchmark.ndarray.js
@@ -21,17 +21,30 @@
 // MODULES //
 
 var bench = require( '@stdlib/bench' );
-var randu = require( '@stdlib/random/base/randu' );
+var uniform = require( '@stdlib/random/base/uniform' );
+var bernoulli = require( '@stdlib/random/base/bernoulli' );
+var filledarrayBy = require( '@stdlib/array/filled-by' );
 var isnanf = require( '@stdlib/math/base/assert/is-nanf' );
 var pow = require( '@stdlib/math/base/special/pow' );
-var Float32Array = require( '@stdlib/array/float32' );
-var Uint8Array = require( '@stdlib/array/uint8' );
 var pkg = require( './../package.json' ).name;
 var snanmskrange = require( './../lib/ndarray.js' );
 
 
 // FUNCTIONS //
 
+/**
+* Returns a random value or `NaN`.
+*
+* @private
+* @returns {number} random number or `NaN`
+*/
+function rand() {
+	if ( bernoulli( 0.8 ) < 1 ) {
+		return NaN;
+	}
+	return uniform( -10.0, 10.0 );
+}
+
 /**
 * Creates a benchmark function.
 *
@@ -42,18 +55,9 @@ var snanmskrange = require( './../lib/ndarray.js' );
 function createBenchmark( len ) {
 	var mask;
 	var x;
-	var i;
 
-	x = new Float32Array( len );
-	mask = new Uint8Array( len );
-	for ( i = 0; i < x.length; i++ ) {
-		if ( randu() < 0.2 ) {
-			mask[ i ] = 1;
-		} else {
-			mask[ i ] = 0;
-		}
-		x[ i ] = ( randu()*20.0 ) - 10.0;
-	}
+	x = filledarrayBy( len, 'float32', rand );
+	mask = filledarrayBy( len, 'uint8', bernoulli.factory( 0.2 ) );
 	return benchmark;
 
 	function benchmark( b ) {
diff --git a/lib/node_modules/@stdlib/stats/base/snanmskrange/benchmark/benchmark.ndarray.native.js b/lib/node_modules/@stdlib/stats/base/snanmskrange/benchmark/benchmark.ndarray.native.js
index b0a26ca11c86..32e0e54c0710 100644
--- a/lib/node_modules/@stdlib/stats/base/snanmskrange/benchmark/benchmark.ndarray.native.js
+++ b/lib/node_modules/@stdlib/stats/base/snanmskrange/benchmark/benchmark.ndarray.native.js
@@ -22,11 +22,11 @@
 
 var resolve = require( 'path' ).resolve;
 var bench = require( '@stdlib/bench' );
-var randu = require( '@stdlib/random/base/randu' );
+var uniform = require( '@stdlib/random/base/uniform' );
+var bernoulli = require( '@stdlib/random/base/bernoulli' );
+var filledarrayBy = require( '@stdlib/array/filled-by' );
 var isnanf = require( '@stdlib/math/base/assert/is-nanf' );
 var pow = require( '@stdlib/math/base/special/pow' );
-var Float32Array = require( '@stdlib/array/float32' );
-var Uint8Array = require( '@stdlib/array/uint8' );
 var tryRequire = require( '@stdlib/utils/try-require' );
 var pkg = require( './../package.json' ).name;
 
@@ -41,6 +41,19 @@ var opts = {
 
 // FUNCTIONS //
 
+/**
+* Returns a random value or `NaN`.
+*
+* @private
+* @returns {number} random number or `NaN`
+*/
+function rand() {
+	if ( bernoulli( 0.8 ) < 1 ) {
+		return NaN;
+	}
+	return uniform( -10.0, 10.0 );
+}
+
 /**
 * Creates a benchmark function.
 *
@@ -51,18 +64,9 @@ var opts = {
 function createBenchmark( len ) {
 	var mask;
 	var x;
-	var i;
 
-	x = new Float32Array( len );
-	mask = new Uint8Array( len );
-	for ( i = 0; i < x.length; i++ ) {
-		if ( randu() < 0.2 ) {
-			mask[ i ] = 1;
-		} else {
-			mask[ i ] = 0;
-		}
-		x[ i ] = ( randu()*20.0 ) - 10.0;
-	}
+	x = filledarrayBy( len, 'float32', rand );
+	mask = filledarrayBy( len, 'uint8', bernoulli.factory( 0.2 ) );
 	return benchmark;
 
 	function benchmark( b ) {
diff --git a/lib/node_modules/@stdlib/stats/base/snanmskrange/docs/repl.txt b/lib/node_modules/@stdlib/stats/base/snanmskrange/docs/repl.txt
index eba615d16a45..de99c0651336 100644
--- a/lib/node_modules/@stdlib/stats/base/snanmskrange/docs/repl.txt
+++ b/lib/node_modules/@stdlib/stats/base/snanmskrange/docs/repl.txt
@@ -3,8 +3,8 @@
     Computes the range of a single-precision floating-point strided array
     according to a mask, ignoring `NaN` values.
 
-    The `N` and `stride` parameters determine which elements are accessed at
-    runtime.
+    The `N` and stride parameters determine which elements in the strided array
+    are accessed at runtime.
 
     Indexing is relative to the first index. To introduce offsets, use a typed
     array views.
@@ -26,13 +26,13 @@
         Input array.
 
     strideX: integer
-        Index increment for `x`.
+        Stride length for `x`.
 
     mask: Uint8Array
         Mask array.
 
     strideMask: integer
-        Index increment for `mask`.
+        Stride length for `mask`.
 
     Returns
     -------
@@ -47,11 +47,10 @@
     > {{alias}}( x.length, x, 1, mask, 1 )
     4.0
 
-    // Using `N` and `stride` parameters:
+    // Using `N` and stride parameters:
     > x = new {{alias:@stdlib/array/float32}}( [ -2.0, 1.0, 1.0, -5.0, 2.0, -1.0, 4.0 ] );
     > mask = new {{alias:@stdlib/array/uint8}}( [ 0, 0, 0, 0, 0, 0, 1 ] );
-    > var N = {{alias:@stdlib/math/base/special/floor}}( x.length / 2 );
-    > {{alias}}( N, x, 2, mask, 2 )
+    > {{alias}}( 3, x, 2, mask, 2 )
     4.0
 
     // Using view offsets:
@@ -59,10 +58,10 @@
     > var x1 = new {{alias:@stdlib/array/float32}}( x0.buffer, x0.BYTES_PER_ELEMENT*1 );
     > var mask0 = new {{alias:@stdlib/array/uint8}}( [ 0, 0, 0, 0, 0, 0, 1 ] );
     > var mask1 = new {{alias:@stdlib/array/uint8}}( mask0.buffer, mask0.BYTES_PER_ELEMENT*1 );
-    > N = {{alias:@stdlib/math/base/special/floor}}( x0.length / 2 );
-    > {{alias}}( N, x1, 2, mask1, 2 )
+    > {{alias}}( 3, x1, 2, mask1, 2 )
     4.0
 
+
 {{alias}}.ndarray( N, x, strideX, offsetX, mask, strideMask, offsetMask )
     Computes the range of a single-precision floating-point strided array
     according to a mask, ignoring `NaN` values and using alternative indexing
@@ -81,7 +80,7 @@
         Input array.
 
     strideX: integer
-        Index increment for `x`.
+        Stride length for `x`.
 
     offsetX: integer
         Starting index for `x`.
@@ -93,7 +92,7 @@
         Index increment for `mask`.
 
     offsetMask: integer
-        Starting index for `mask`.
+        Stride length for `mask`.
 
     Returns
     -------
@@ -111,8 +110,7 @@
     // Using offset parameter:
     > x = new {{alias:@stdlib/array/float32}}( [ 1.0, -2.0, 3.0, 2.0, 5.0, -1.0, 4.0 ] );
     > mask = new {{alias:@stdlib/array/uint8}}( [ 0, 0, 0, 0, 0, 0, 1 ] );
-    > var N = {{alias:@stdlib/math/base/special/floor}}( x.length / 2 );
-    > {{alias}}.ndarray( N, x, 2, 1, mask, 2, 1 )
+    > {{alias}}.ndarray( 3, x, 2, 1, mask, 2, 1 )
     4.0
 
     See Also
diff --git a/lib/node_modules/@stdlib/stats/base/snanmskrange/examples/c/example.c b/lib/node_modules/@stdlib/stats/base/snanmskrange/examples/c/example.c
index 604faf9ed938..d0059c237905 100644
--- a/lib/node_modules/@stdlib/stats/base/snanmskrange/examples/c/example.c
+++ b/lib/node_modules/@stdlib/stats/base/snanmskrange/examples/c/example.c
@@ -22,17 +22,17 @@
 
 int main( void ) {
 	// Create a strided array:
-	float x[] = { 1.0, 2.0, 3.0, 4.0, 5.0, 6.0, 7.0, 8.0, 9.0, 10.0 };
+	const float x[] = { 1.0f, 2.0f, 3.0f, 4.0f, 5.0f, 6.0f, 7.0f, 8.0f, 0.0f/0.0f, 0.0f/0.0f };
 
 	// Create a mask array:
-	uint8_t mask[] = { 0, 0, 0, 0, 0, 0, 0, 0, 1, 1 };
+	const uint8_t mask[] = { 0, 0, 0, 0, 0, 0, 0, 0, 1, 1 };
 
 	// Specify the number of elements:
-	int64_t N = 5;
+	const int N = 5;
 
 	// Specify the stride lengths:
-	int64_t strideX = 2;
-	int64_t strideMask = 2;
+	const int strideX = 2;
+	const int strideMask = 2;
 
 	// Compute the range:
 	float v = stdlib_strided_snanmskrange( N, x, strideX, mask, strideMask );
diff --git a/lib/node_modules/@stdlib/stats/base/snanmskrange/examples/index.js b/lib/node_modules/@stdlib/stats/base/snanmskrange/examples/index.js
index 2ac9bcb2cbf0..fa585783ead3 100644
--- a/lib/node_modules/@stdlib/stats/base/snanmskrange/examples/index.js
+++ b/lib/node_modules/@stdlib/stats/base/snanmskrange/examples/index.js
@@ -18,31 +18,22 @@
 
 'use strict';
 
-var randu = require( '@stdlib/random/base/randu' );
-var round = require( '@stdlib/math/base/special/round' );
-var Float32Array = require( '@stdlib/array/float32' );
-var Uint8Array = require( '@stdlib/array/uint8' );
+var uniform = require( '@stdlib/random/base/uniform' );
+var bernoulli = require( '@stdlib/random/base/bernoulli' );
+var filledarrayBy = require( '@stdlib/array/filled-by' );
 var snanmskrange = require( './../lib' );
 
-var mask;
-var x;
-var i;
-
-x = new Float32Array( 10 );
-mask = new Uint8Array( x.length );
-for ( i = 0; i < x.length; i++ ) {
-	if ( randu() < 0.2 ) {
-		mask[ i ] = 1;
-	} else {
-		mask[ i ] = 0;
-	}
-	if ( randu() < 0.1 ) {
-		x[ i ] = NaN;
-	} else {
-		x[ i ] = round( (randu()*100.0) - 50.0 );
+function rand() {
+	if ( bernoulli( 0.8 ) < 1 ) {
+		return NaN;
 	}
+	return uniform( -50.0, 50.0 );
 }
+
+var x = filledarrayBy( 10, 'float32', rand );
 console.log( x );
+
+var mask = filledarrayBy( x.length, 'uint8', bernoulli.factory( 0.2 ) );
 console.log( mask );
 
 var v = snanmskrange( x.length, x, 1, mask, 1 );
diff --git a/lib/node_modules/@stdlib/stats/base/snanmskrange/include.gypi b/lib/node_modules/@stdlib/stats/base/snanmskrange/include.gypi
index 868c5c12e852..26476a8c2655 100644
--- a/lib/node_modules/@stdlib/stats/base/snanmskrange/include.gypi
+++ b/lib/node_modules/@stdlib/stats/base/snanmskrange/include.gypi
@@ -36,7 +36,7 @@
 
     # Source files:
     'src_files': [
-      '<(src_dir)/addon.cpp',
+      '<(src_dir)/addon.c',
       '<!@(node -e "var arr = require(\'@stdlib/utils/library-manifest\')(\'./manifest.json\',{},{\'basedir\':process.cwd(),\'paths\':\'posix\'}).src; for ( var i = 0; i < arr.length; i++ ) { console.log( arr[ i ] ); }")',
     ],
 
diff --git a/lib/node_modules/@stdlib/stats/base/snanmskrange/include/stdlib/stats/base/snanmskrange.h b/lib/node_modules/@stdlib/stats/base/snanmskrange/include/stdlib/stats/base/snanmskrange.h
index 053d3cced4f0..6338e6a6e4f4 100644
--- a/lib/node_modules/@stdlib/stats/base/snanmskrange/include/stdlib/stats/base/snanmskrange.h
+++ b/lib/node_modules/@stdlib/stats/base/snanmskrange/include/stdlib/stats/base/snanmskrange.h
@@ -19,6 +19,7 @@
 #ifndef STDLIB_STATS_BASE_SNANMSKRANGE_H
 #define STDLIB_STATS_BASE_SNANMSKRANGE_H
 
+#include "stdlib/blas/base/shared.h"
 #include <stdint.h>
 
 /*
@@ -31,7 +32,12 @@ extern "C" {
 /**
 * Computes the range of a single-precision floating-point strided array according to a mask, ignoring `NaN` values.
 */
-float stdlib_strided_snanmskrange( const int64_t N, const float *X, const int64_t strideX, const uint8_t *Mask, const int64_t strideMask );
+float API_SUFFIX(stdlib_strided_snanmskrange)( const CBLAS_INT N, const float *X, const CBLAS_INT strideX, const uint8_t *Mask, const CBLAS_INT strideMask );
+
+/**
+* Computes the range of a single-precision floating-point strided array according to a mask, ignoring `NaN` values and using alternative indexing semantics.
+*/
+float API_SUFFIX(stdlib_strided_snanmskrange_ndarray)( const CBLAS_INT N, const float *X, const CBLAS_INT strideX, const CBLAS_INT offsetX, const uint8_t *Mask, const CBLAS_INT strideMask, const CBLAS_INT offsetMask );
 
 #ifdef __cplusplus
 }
diff --git a/lib/node_modules/@stdlib/stats/base/snanmskrange/lib/index.js b/lib/node_modules/@stdlib/stats/base/snanmskrange/lib/index.js
index d72972075b79..e2b40767ac1c 100644
--- a/lib/node_modules/@stdlib/stats/base/snanmskrange/lib/index.js
+++ b/lib/node_modules/@stdlib/stats/base/snanmskrange/lib/index.js
@@ -37,14 +37,12 @@
 * @example
 * var Float32Array = require( '@stdlib/array/float32' );
 * var Uint8Array = require( '@stdlib/array/uint8' );
-* var floor = require( '@stdlib/math/base/special/floor' );
 * var snanmskrange = require( '@stdlib/stats/base/snanmskrange' );
 *
 * var x = new Float32Array( [ 2.0, 1.0, 2.0, -2.0, -2.0, 2.0, 3.0, 4.0, 5.0, 6.0 ] );
 * var mask = new Uint8Array( [ 0, 0, 0, 0, 0, 0, 0, 0, 1, 1 ] );
-* var N = floor( x.length / 2 );
 *
-* var v = snanmskrange.ndarray( N, x, 2, 1, mask, 2, 1 );
+* var v = snanmskrange.ndarray( 5, x, 2, 1, mask, 2, 1 );
 * // returns 6.0
 */
 
diff --git a/lib/node_modules/@stdlib/stats/base/snanmskrange/lib/ndarray.js b/lib/node_modules/@stdlib/stats/base/snanmskrange/lib/ndarray.js
index 5469fdcb1378..26595ac27dbe 100644
--- a/lib/node_modules/@stdlib/stats/base/snanmskrange/lib/ndarray.js
+++ b/lib/node_modules/@stdlib/stats/base/snanmskrange/lib/ndarray.js
@@ -41,13 +41,11 @@ var isnanf = require( '@stdlib/math/base/assert/is-nanf' );
 * @example
 * var Float32Array = require( '@stdlib/array/float32' );
 * var Uint8Array = require( '@stdlib/array/uint8' );
-* var floor = require( '@stdlib/math/base/special/floor' );
 *
 * var x = new Float32Array( [ 2.0, 1.0, 2.0, -2.0, -2.0, 2.0, 3.0, 4.0, 5.0, 6.0 ] );
 * var mask = new Uint8Array( [ 0, 0, 0, 0, 0, 0, 0, 0, 1, 1 ] );
-* var N = floor( x.length / 2 );
 *
-* var v = snanmskrange( N, x, 2, 1, mask, 2, 1 );
+* var v = snanmskrange( 5, x, 2, 1, mask, 2, 1 );
 * // returns 6.0
 */
 function snanmskrange( N, x, strideX, offsetX, mask, strideMask, offsetMask ) {
diff --git a/lib/node_modules/@stdlib/stats/base/snanmskrange/lib/ndarray.native.js b/lib/node_modules/@stdlib/stats/base/snanmskrange/lib/ndarray.native.js
index 3f548b62e6d7..c6d2ea77c2e8 100644
--- a/lib/node_modules/@stdlib/stats/base/snanmskrange/lib/ndarray.native.js
+++ b/lib/node_modules/@stdlib/stats/base/snanmskrange/lib/ndarray.native.js
@@ -20,9 +20,7 @@
 
 // MODULES //
 
-var Float32Array = require( '@stdlib/array/float32' );
-var Uint8Array = require( '@stdlib/array/uint8' );
-var addon = require( './snanmskrange.native.js' );
+var addon = require( './../src/addon.node' );
 
 
 // MAIN //
@@ -42,27 +40,15 @@ var addon = require( './snanmskrange.native.js' );
 * @example
 * var Float32Array = require( '@stdlib/array/float32' );
 * var Uint8Array = require( '@stdlib/array/uint8' );
-* var floor = require( '@stdlib/math/base/special/floor' );
 *
 * var x = new Float32Array( [ 2.0, 1.0, 2.0, -2.0, -2.0, 2.0, 3.0, 4.0, 5.0, 6.0 ] );
 * var mask = new Uint8Array( [ 0, 0, 0, 0, 0, 0, 0, 0, 1, 1 ] );
-* var N = floor( x.length / 2 );
 *
-* var v = snanmskrange( N, x, 2, 1, mask, 2, 1 );
+* var v = snanmskrange( 5, x, 2, 1, mask, 2, 1 );
 * // returns 6.0
 */
 function snanmskrange( N, x, strideX, offsetX, mask, strideMask, offsetMask ) {
-	var viewX;
-	var viewM;
-	if ( strideX < 0 ) {
-		offsetX += (N-1) * strideX;
-	}
-	if ( strideMask < 0 ) {
-		offsetMask += (N-1) * strideMask;
-	}
-	viewX = new Float32Array( x.buffer, x.byteOffset+(x.BYTES_PER_ELEMENT*offsetX), x.length-offsetX ); // eslint-disable-line max-len
-	viewM = new Uint8Array( mask.buffer, mask.byteOffset+(mask.BYTES_PER_ELEMENT*offsetMask), mask.length-offsetMask ); // eslint-disable-line max-len
-	return addon( N, viewX, strideX, viewM, strideMask );
+	return addon.ndarray( N, x, strideX, offsetX, mask, strideMask, offsetMask ); // eslint-disable-line max-len
 }
 
 
diff --git a/lib/node_modules/@stdlib/stats/base/snanmskrange/lib/snanmskrange.js b/lib/node_modules/@stdlib/stats/base/snanmskrange/lib/snanmskrange.js
index acfc2e1877db..7243afb462ec 100644
--- a/lib/node_modules/@stdlib/stats/base/snanmskrange/lib/snanmskrange.js
+++ b/lib/node_modules/@stdlib/stats/base/snanmskrange/lib/snanmskrange.js
@@ -20,8 +20,8 @@
 
 // MODULES //
 
-var float64ToFloat32 = require( '@stdlib/number/float64/base/to-float32' );
-var isnanf = require( '@stdlib/math/base/assert/is-nanf' );
+var stride2offset = require( '@stdlib/strided/base/stride2offset' );
+var ndarray = require( './ndarray.js' );
 
 
 // MAIN //
@@ -47,57 +47,7 @@ var isnanf = require( '@stdlib/math/base/assert/is-nanf' );
 * // returns 4.0
 */
 function snanmskrange( N, x, strideX, mask, strideMask ) {
-	var max;
-	var min;
-	var ix;
-	var im;
-	var v;
-	var i;
-
-	if ( N <= 0 ) {
-		return NaN;
-	}
-	if ( strideX < 0 ) {
-		ix = (1-N) * strideX;
-	} else {
-		ix = 0;
-	}
-	if ( strideMask < 0 ) {
-		im = (1-N) * strideMask;
-	} else {
-		im = 0;
-	}
-	for ( i = 0; i < N; i++ ) {
-		v = x[ ix ];
-		if ( v === v && mask[ im ] === 0 ) {
-			break;
-		}
-		ix += strideX;
-		im += strideMask;
-	}
-	if ( i === N ) {
-		return NaN;
-	}
-	min = v;
-	max = min;
-	i += 1;
-	for ( i; i < N; i++ ) {
-		ix += strideX;
-		im += strideMask;
-		if ( mask[ im ] ) {
-			continue;
-		}
-		v = x[ ix ];
-		if ( isnanf( v ) ) {
-			continue;
-		}
-		if ( v < min ) {
-			min = v;
-		} else if ( v > max ) {
-			max = v;
-		}
-	}
-	return float64ToFloat32( max - min );
+	return ndarray( N, x, strideX, stride2offset( N, strideX ), mask, strideMask, stride2offset( N, strideMask ) ); // eslint-disable-line max-len
 }
 
 
diff --git a/lib/node_modules/@stdlib/stats/base/snanmskrange/manifest.json b/lib/node_modules/@stdlib/stats/base/snanmskrange/manifest.json
index 6926f292322f..97d8938bc8a9 100644
--- a/lib/node_modules/@stdlib/stats/base/snanmskrange/manifest.json
+++ b/lib/node_modules/@stdlib/stats/base/snanmskrange/manifest.json
@@ -1,5 +1,8 @@
 {
-  "options": {},
+  "options": {
+    "task": "build",
+    "wasm": false
+  },
   "fields": [
     {
       "field": "src",
@@ -24,18 +27,77 @@
   ],
   "confs": [
     {
+      "task": "build",
+      "wasm": false,
       "src": [
-        "./src/snanmskrange.c"
+        "./src/main.c"
       ],
       "include": [
         "./include"
       ],
-      "libraries": [
-        "-lm"
+      "libraries": [],
+      "libpath": [],
+      "dependencies": [
+        "@stdlib/blas/base/shared",
+        "@stdlib/math/base/assert/is-nanf",
+        "@stdlib/strided/base/stride2offset",
+        "@stdlib/napi/export",
+        "@stdlib/napi/argv",
+        "@stdlib/napi/argv-int64",
+        "@stdlib/napi/argv-strided-float32array",
+        "@stdlib/napi/argv-strided-uint8array",
+        "@stdlib/napi/create-double"
+      ]
+    },
+    {
+      "task": "benchmark",
+      "wasm": false,
+      "src": [
+        "./src/main.c"
+      ],
+      "include": [
+        "./include"
+      ],
+      "libraries": [],
+      "libpath": [],
+      "dependencies": [
+        "@stdlib/blas/base/shared",
+        "@stdlib/math/base/assert/is-nanf",
+        "@stdlib/strided/base/stride2offset"
+      ]
+    },
+    {
+      "task": "examples",
+      "wasm": false,
+      "src": [
+        "./src/main.c"
+      ],
+      "include": [
+        "./include"
+      ],
+      "libraries": [],
+      "libpath": [],
+      "dependencies": [
+        "@stdlib/blas/base/shared",
+        "@stdlib/math/base/assert/is-nanf",
+        "@stdlib/strided/base/stride2offset"
+      ]
+    },
+    {
+      "task": "",
+      "wasm": true,
+      "src": [
+        "./src/main.c"
+      ],
+      "include": [
+        "./include"
       ],
+      "libraries": [],
       "libpath": [],
       "dependencies": [
-        "@stdlib/math/base/assert/is-nanf"
+        "@stdlib/blas/base/shared",
+        "@stdlib/math/base/assert/is-nanf",
+        "@stdlib/strided/base/stride2offset"
       ]
     }
   ]
diff --git a/lib/node_modules/@stdlib/stats/base/snanmskrange/src/addon.c b/lib/node_modules/@stdlib/stats/base/snanmskrange/src/addon.c
new file mode 100644
index 000000000000..c84180a184e6
--- /dev/null
+++ b/lib/node_modules/@stdlib/stats/base/snanmskrange/src/addon.c
@@ -0,0 +1,67 @@
+/**
+* @license Apache-2.0
+*
+* Copyright (c) 2025 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.
+*/
+
+#include "stdlib/stats/base/snanmskrange.h"
+#include "stdlib/napi/export.h"
+#include "stdlib/napi/argv.h"
+#include "stdlib/napi/argv_int64.h"
+#include "stdlib/napi/argv_strided_float32array.h"
+#include "stdlib/napi/argv_strided_uint8array.h"
+#include "stdlib/napi/create_double.h"
+#include "stdlib/blas/base/shared.h"
+#include <node_api.h>
+
+/**
+* Receives JavaScript callback invocation data.
+*
+* @param env    environment under which the function is invoked
+* @param info   callback data
+* @return       Node-API value
+*/
+static napi_value addon( napi_env env, napi_callback_info info ) {
+	STDLIB_NAPI_ARGV( env, info, argv, argc, 5 );
+	STDLIB_NAPI_ARGV_INT64( env, N, argv, 0 );
+	STDLIB_NAPI_ARGV_INT64( env, strideX, argv, 2 );
+	STDLIB_NAPI_ARGV_INT64( env, strideMask, argv, 4 );
+	STDLIB_NAPI_ARGV_STRIDED_FLOAT32ARRAY( env, X, N, strideX, argv, 1 );
+	STDLIB_NAPI_ARGV_STRIDED_UINT8ARRAY( env, Mask, N, strideMask, argv, 3 );
+	STDLIB_NAPI_CREATE_DOUBLE( env, (double)API_SUFFIX(stdlib_strided_snanmskrange)( N, X, strideX, Mask, strideMask ), v );
+	return v;
+}
+
+/**
+* Receives JavaScript callback invocation data.
+*
+* @param env    environment under which the function is invoked
+* @param info   callback data
+* @return       Node-API value
+*/
+static napi_value addon_method( napi_env env, napi_callback_info info ) {
+	STDLIB_NAPI_ARGV( env, info, argv, argc, 7 );
+	STDLIB_NAPI_ARGV_INT64( env, N, argv, 0 );
+	STDLIB_NAPI_ARGV_INT64( env, strideX, argv, 2 );
+	STDLIB_NAPI_ARGV_INT64( env, offsetX, argv, 3 );
+	STDLIB_NAPI_ARGV_INT64( env, strideMask, argv, 5 );
+	STDLIB_NAPI_ARGV_INT64( env, offsetMask, argv, 6 );
+	STDLIB_NAPI_ARGV_STRIDED_FLOAT32ARRAY( env, X, N, strideX, argv, 1 );
+	STDLIB_NAPI_ARGV_STRIDED_UINT8ARRAY( env, Mask, N, strideMask, argv, 4 );
+	STDLIB_NAPI_CREATE_DOUBLE( env, (double)API_SUFFIX(stdlib_strided_snanmskrange_ndarray)( N, X, strideX, offsetX, Mask, strideMask, offsetMask ), v );
+	return v;
+}
+
+STDLIB_NAPI_MODULE_EXPORT_FCN_WITH_METHOD( addon, "ndarray", addon_method )
diff --git a/lib/node_modules/@stdlib/stats/base/snanmskrange/src/addon.cpp b/lib/node_modules/@stdlib/stats/base/snanmskrange/src/addon.cpp
deleted file mode 100644
index a2482f4e91fa..000000000000
--- a/lib/node_modules/@stdlib/stats/base/snanmskrange/src/addon.cpp
+++ /dev/null
@@ -1,153 +0,0 @@
-/**
-* @license Apache-2.0
-*
-* Copyright (c) 2020 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.
-*/
-
-#include "stdlib/stats/base/snanmskrange.h"
-#include <node_api.h>
-#include <stdint.h>
-#include <stdlib.h>
-#include <stdbool.h>
-#include <assert.h>
-
-/**
-* Add-on namespace.
-*/
-namespace stdlib_stats_base_snanmskrange {
-
-	/**
-	* Computes the range of a single-precision floating-point strided array according to a mask, ignoring `NaN` values.
-	*
-	* ## Notes
-	*
-	* -   When called from JavaScript, the function expects five arguments:
-	*
-	*     -   `N`: number of indexed elements
-	*     -   `X`: input array
-	*     -   `strideX`: `X` stride length
-	*     -   `Mask`: mask array
-	*     -   `strideMask`: `Mask` stride length
-	*/
-	napi_value node_snanmskrange( napi_env env, napi_callback_info info ) {
-		napi_status status;
-
-		size_t argc = 5;
-		napi_value argv[ 5 ];
-		status = napi_get_cb_info( env, info, &argc, argv, nullptr, nullptr );
-		assert( status == napi_ok );
-
-		if ( argc < 5 ) {
-			napi_throw_error( env, nullptr, "invalid invocation. Must provide 5 arguments." );
-			return nullptr;
-		}
-
-		napi_valuetype vtype0;
-		status = napi_typeof( env, argv[ 0 ], &vtype0 );
-		assert( status == napi_ok );
-		if ( vtype0 != napi_number ) {
-			napi_throw_type_error( env, nullptr, "invalid argument. First argument must be a number." );
-			return nullptr;
-		}
-
-		bool res1;
-		status = napi_is_typedarray( env, argv[ 1 ], &res1 );
-		assert( status == napi_ok );
-		if ( res1 == false ) {
-			napi_throw_type_error( env, nullptr, "invalid argument. Second argument must be a Float32Array." );
-			return nullptr;
-		}
-
-		napi_valuetype vtype2;
-		status = napi_typeof( env, argv[ 2 ], &vtype2 );
-		assert( status == napi_ok );
-		if ( vtype2 != napi_number ) {
-			napi_throw_type_error( env, nullptr, "invalid argument. Third argument must be a number." );
-			return nullptr;
-		}
-
-		bool res3;
-		status = napi_is_typedarray( env, argv[ 3 ], &res3 );
-		assert( status == napi_ok );
-		if ( res3 == false ) {
-			napi_throw_type_error( env, nullptr, "invalid argument. Fourth argument must be a Uint8Array." );
-			return nullptr;
-		}
-
-		napi_valuetype vtype4;
-		status = napi_typeof( env, argv[ 4 ], &vtype4 );
-		assert( status == napi_ok );
-		if ( vtype4 != napi_number ) {
-			napi_throw_type_error( env, nullptr, "invalid argument. Fifth argument must be a number." );
-			return nullptr;
-		}
-
-		int64_t N;
-		status = napi_get_value_int64( env, argv[ 0 ], &N );
-		assert( status == napi_ok );
-
-		int64_t strideX;
-		status = napi_get_value_int64( env, argv[ 2 ], &strideX );
-		assert( status == napi_ok );
-
-		int64_t strideMask;
-		status = napi_get_value_int64( env, argv[ 4 ], &strideMask );
-		assert( status == napi_ok );
-
-		napi_typedarray_type vtype1;
-		size_t xlen;
-		void *X;
-		status = napi_get_typedarray_info( env, argv[ 1 ], &vtype1, &xlen, &X, nullptr, nullptr );
-		assert( status == napi_ok );
-		if ( vtype1 != napi_float32_array ) {
-			napi_throw_type_error( env, nullptr, "invalid argument. Second argument must be a Float32Array." );
-			return nullptr;
-		}
-		if ( (N-1)*llabs(strideX) >= (int64_t)xlen ) {
-			napi_throw_range_error( env, nullptr, "invalid argument. Second argument has insufficient elements based on the associated stride and the number of indexed elements." );
-			return nullptr;
-		}
-
-		napi_typedarray_type vtype3;
-		size_t mlen;
-		void *Mask;
-		status = napi_get_typedarray_info( env, argv[ 3 ], &vtype3, &mlen, &Mask, nullptr, nullptr );
-		assert( status == napi_ok );
-		if ( vtype3 != napi_uint8_array ) {
-			napi_throw_type_error( env, nullptr, "invalid argument. Fourth argument must be a Uint8Array." );
-			return nullptr;
-		}
-		if ( (N-1)*llabs(strideMask) >= (int64_t)mlen ) {
-			napi_throw_range_error( env, nullptr, "invalid argument. Fourth argument has insufficient elements based on the associated stride and the number of indexed elements." );
-			return nullptr;
-		}
-
-		napi_value v;
-		status = napi_create_double( env, (double)stdlib_strided_snanmskrange( N, (float *)X, strideX, (uint8_t *)Mask, strideMask ), &v );
-		assert( status == napi_ok );
-
-		return v;
-	}
-
-	napi_value Init( napi_env env, napi_value exports ) {
-		napi_status status;
-		napi_value fcn;
-		status = napi_create_function( env, "exports", NAPI_AUTO_LENGTH, node_snanmskrange, NULL, &fcn );
-		assert( status == napi_ok );
-		return fcn;
-	}
-
-	NAPI_MODULE( NODE_GYP_MODULE_NAME, Init )
-} // end namespace stdlib_stats_base_snanmskrange
diff --git a/lib/node_modules/@stdlib/stats/base/snanmskrange/src/snanmskrange.c b/lib/node_modules/@stdlib/stats/base/snanmskrange/src/main.c
similarity index 56%
rename from lib/node_modules/@stdlib/stats/base/snanmskrange/src/snanmskrange.c
rename to lib/node_modules/@stdlib/stats/base/snanmskrange/src/main.c
index 7aa5036dd09e..15caaa4c2a3a 100644
--- a/lib/node_modules/@stdlib/stats/base/snanmskrange/src/snanmskrange.c
+++ b/lib/node_modules/@stdlib/stats/base/snanmskrange/src/main.c
@@ -18,6 +18,8 @@
 
 #include "stdlib/stats/base/snanmskrange.h"
 #include "stdlib/math/base/assert/is_nanf.h"
+#include "stdlib/strided/base/stride2offset.h"
+#include "stdlib/blas/base/shared.h"
 #include <stdint.h>
 
 /**
@@ -30,10 +32,28 @@
 * @param strideMask  Mask stride length
 * @return            output value
 */
-float stdlib_strided_snanmskrange( const int64_t N, const float *X, const int64_t strideX, const uint8_t *Mask, const int64_t strideMask ) {
-	int64_t ix;
-	int64_t im;
-	int64_t i;
+float API_SUFFIX(stdlib_strided_snanmskrange)( const CBLAS_INT N, const float *X, const CBLAS_INT strideX, const uint8_t *Mask, const CBLAS_INT strideMask ) {
+	const CBLAS_INT ox = stdlib_strided_stride2offset( N, strideX );
+	const CBLAS_INT om = stdlib_strided_stride2offset( N, strideMask );
+	return API_SUFFIX(stdlib_strided_snanmskrange_ndarray)( N, X, strideX, ox, Mask, strideMask, om );
+}
+
+/**
+* Computes the range of a single-precision floating-point strided array according to a mask, ignoring `NaN` values and using alternative indexing semantics.
+*
+* @param N           number of indexed elements
+* @param X           input array
+* @param strideX     X stride length
+* @param offsetX     starting index for X
+* @param Mask        mask array
+* @param strideMask  Mask stride length
+* @param offsetMask  starting index for Mask
+* @return            output value
+*/
+float API_SUFFIX(stdlib_strided_snanmskrange_ndarray)( const CBLAS_INT N, const float *X, const CBLAS_INT strideX, const CBLAS_INT offsetX, const uint8_t *Mask, const CBLAS_INT strideMask, const CBLAS_INT offsetMask ) {
+	CBLAS_INT ix;
+	CBLAS_INT im;
+	CBLAS_INT i;
 	float max;
 	float min;
 	float v;
@@ -41,16 +61,8 @@ float stdlib_strided_snanmskrange( const int64_t N, const float *X, const int64_
 	if ( N <= 0 ) {
 		return 0.0f / 0.0f; // NaN
 	}
-	if ( strideX < 0 ) {
-		ix = (1-N) * strideX;
-	} else {
-		ix = 0;
-	}
-	if ( strideMask < 0 ) {
-		im = (1-N) * strideMask;
-	} else {
-		im = 0;
-	}
+	ix = offsetX;
+	im = offsetMask;
 	for ( i = 0; i < N; i++ ) {
 		v = X[ ix ];
 		if ( v == v && Mask[ im ] == 0 ) {
diff --git a/lib/node_modules/@stdlib/stats/base/snanmskrange/test/test.ndarray.js b/lib/node_modules/@stdlib/stats/base/snanmskrange/test/test.ndarray.js
index 442887e3562f..35513df25f93 100644
--- a/lib/node_modules/@stdlib/stats/base/snanmskrange/test/test.ndarray.js
+++ b/lib/node_modules/@stdlib/stats/base/snanmskrange/test/test.ndarray.js
@@ -21,7 +21,6 @@
 // MODULES //
 
 var tape = require( 'tape' );
-var floor = require( '@stdlib/math/base/special/floor' );
 var isnanf = require( '@stdlib/math/base/assert/is-nanf' );
 var isPositiveZerof = require( '@stdlib/math/base/assert/is-positive-zerof' );
 var Float32Array = require( '@stdlib/array/float32' );
@@ -116,7 +115,7 @@ tape( 'if provided an `N` parameter less than or equal to `0`, the function retu
 	v = snanmskrange( 0, x, 1, 0, mask, 1, 0 );
 	t.strictEqual( isnanf( v ), true, 'returns expected value' );
 
-	v = snanmskrange( -1, x, 1, 0, mask, 1 );
+	v = snanmskrange( -1, x, 1, 0, mask, 1, 0 );
 	t.strictEqual( isnanf( v ), true, 'returns expected value' );
 
 	t.end();
@@ -138,7 +137,6 @@ tape( 'if provided an `N` parameter equal to `1`, the function returns `0`', fun
 
 tape( 'the function supports `stride` parameters', function test( t ) {
 	var mask;
-	var N;
 	var x;
 	var v;
 
@@ -171,8 +169,7 @@ tape( 'the function supports `stride` parameters', function test( t ) {
 		0
 	]);
 
-	N = floor( x.length / 2 );
-	v = snanmskrange( N, x, 2, 0, mask, 2, 0 );
+	v = snanmskrange( 6, x, 2, 0, mask, 2, 0 );
 
 	t.strictEqual( v, 6.0, 'returns expected value' );
 	t.end();
@@ -180,7 +177,6 @@ tape( 'the function supports `stride` parameters', function test( t ) {
 
 tape( 'the function supports negative `stride` parameters', function test( t ) {
 	var mask;
-	var N;
 	var x;
 	var v;
 
@@ -212,9 +208,7 @@ tape( 'the function supports negative `stride` parameters', function test( t ) {
 		0, // 0
 		0
 	]);
-
-	N = floor( x.length / 2 );
-	v = snanmskrange( N, x, -2, 10, mask, -2, 10 );
+	v = snanmskrange( 6, x, -2, 10, mask, -2, 10 );
 
 	t.strictEqual( v, 6.0, 'returns expected value' );
 	t.end();
@@ -222,7 +216,6 @@ tape( 'the function supports negative `stride` parameters', function test( t ) {
 
 tape( 'the function supports `offset` parameters', function test( t ) {
 	var mask;
-	var N;
 	var x;
 	var v;
 
@@ -254,9 +247,8 @@ tape( 'the function supports `offset` parameters', function test( t ) {
 		0,
 		0   // 5
 	]);
-	N = floor( x.length / 2 );
 
-	v = snanmskrange( N, x, 2, 1, mask, 2, 1 );
+	v = snanmskrange( 6, x, 2, 1, mask, 2, 1 );
 	t.strictEqual( v, 6.0, 'returns expected value' );
 
 	t.end();
diff --git a/lib/node_modules/@stdlib/stats/base/snanmskrange/test/test.ndarray.native.js b/lib/node_modules/@stdlib/stats/base/snanmskrange/test/test.ndarray.native.js
index b00e9ac0f626..2a610b89c084 100644
--- a/lib/node_modules/@stdlib/stats/base/snanmskrange/test/test.ndarray.native.js
+++ b/lib/node_modules/@stdlib/stats/base/snanmskrange/test/test.ndarray.native.js
@@ -22,7 +22,6 @@
 
 var resolve = require( 'path' ).resolve;
 var tape = require( 'tape' );
-var floor = require( '@stdlib/math/base/special/floor' );
 var isnanf = require( '@stdlib/math/base/assert/is-nanf' );
 var isPositiveZerof = require( '@stdlib/math/base/assert/is-positive-zerof' );
 var Float32Array = require( '@stdlib/array/float32' );
@@ -125,7 +124,7 @@ tape( 'if provided an `N` parameter less than or equal to `0`, the function retu
 	v = snanmskrange( 0, x, 1, 0, mask, 1, 0 );
 	t.strictEqual( isnanf( v ), true, 'returns expected value' );
 
-	v = snanmskrange( -1, x, 1, 0, mask, 1 );
+	v = snanmskrange( -1, x, 1, 0, mask, 1, 0 );
 	t.strictEqual( isnanf( v ), true, 'returns expected value' );
 
 	t.end();
@@ -147,7 +146,6 @@ tape( 'if provided an `N` parameter equal to `1`, the function returns `0`', opt
 
 tape( 'the function supports `stride` parameters', opts, function test( t ) {
 	var mask;
-	var N;
 	var x;
 	var v;
 
@@ -180,8 +178,7 @@ tape( 'the function supports `stride` parameters', opts, function test( t ) {
 		0
 	]);
 
-	N = floor( x.length / 2 );
-	v = snanmskrange( N, x, 2, 0, mask, 2, 0 );
+	v = snanmskrange( 6, x, 2, 0, mask, 2, 0 );
 
 	t.strictEqual( v, 6.0, 'returns expected value' );
 	t.end();
@@ -189,7 +186,6 @@ tape( 'the function supports `stride` parameters', opts, function test( t ) {
 
 tape( 'the function supports negative `stride` parameters', opts, function test( t ) {
 	var mask;
-	var N;
 	var x;
 	var v;
 
@@ -222,8 +218,7 @@ tape( 'the function supports negative `stride` parameters', opts, function test(
 		0
 	]);
 
-	N = floor( x.length / 2 );
-	v = snanmskrange( N, x, -2, 10, mask, -2, 10 );
+	v = snanmskrange( 6, x, -2, 10, mask, -2, 10 );
 
 	t.strictEqual( v, 6.0, 'returns expected value' );
 	t.end();
@@ -231,7 +226,6 @@ tape( 'the function supports negative `stride` parameters', opts, function test(
 
 tape( 'the function supports `offset` parameters', opts, function test( t ) {
 	var mask;
-	var N;
 	var x;
 	var v;
 
@@ -263,9 +257,8 @@ tape( 'the function supports `offset` parameters', opts, function test( t ) {
 		0,
 		0   // 5
 	]);
-	N = floor( x.length / 2 );
 
-	v = snanmskrange( N, x, 2, 1, mask, 2, 1 );
+	v = snanmskrange( 6, x, 2, 1, mask, 2, 1 );
 	t.strictEqual( v, 6.0, 'returns expected value' );
 
 	t.end();
diff --git a/lib/node_modules/@stdlib/stats/base/snanmskrange/test/test.snanmskrange.js b/lib/node_modules/@stdlib/stats/base/snanmskrange/test/test.snanmskrange.js
index bf11be1c6bd3..20efe2743650 100644
--- a/lib/node_modules/@stdlib/stats/base/snanmskrange/test/test.snanmskrange.js
+++ b/lib/node_modules/@stdlib/stats/base/snanmskrange/test/test.snanmskrange.js
@@ -21,7 +21,6 @@
 // MODULES //
 
 var tape = require( 'tape' );
-var floor = require( '@stdlib/math/base/special/floor' );
 var isnanf = require( '@stdlib/math/base/assert/is-nanf' );
 var isPositiveZerof = require( '@stdlib/math/base/assert/is-positive-zerof' );
 var Float32Array = require( '@stdlib/array/float32' );
@@ -138,7 +137,6 @@ tape( 'if provided an `N` parameter equal to `1`, the function returns `0`', fun
 
 tape( 'the function supports `stride` parameters', function test( t ) {
 	var mask;
-	var N;
 	var x;
 	var v;
 
@@ -171,8 +169,7 @@ tape( 'the function supports `stride` parameters', function test( t ) {
 		0
 	]);
 
-	N = floor( x.length / 2 );
-	v = snanmskrange( N, x, 2, mask, 2 );
+	v = snanmskrange( 6, x, 2, mask, 2 );
 
 	t.strictEqual( v, 6.0, 'returns expected value' );
 	t.end();
@@ -180,7 +177,6 @@ tape( 'the function supports `stride` parameters', function test( t ) {
 
 tape( 'the function supports negative `stride` parameters', function test( t ) {
 	var mask;
-	var N;
 	var x;
 	var v;
 
@@ -213,8 +209,7 @@ tape( 'the function supports negative `stride` parameters', function test( t ) {
 		0
 	]);
 
-	N = floor( x.length / 2 );
-	v = snanmskrange( N, x, -2, mask, -2 );
+	v = snanmskrange( 6, x, -2, mask, -2 );
 
 	t.strictEqual( v, 6.0, 'returns expected value' );
 	t.end();
@@ -225,7 +220,6 @@ tape( 'the function supports view offsets', function test( t ) {
 	var mask1;
 	var x0;
 	var x1;
-	var N;
 	var v;
 
 	x0 = new Float32Array([
@@ -261,9 +255,8 @@ tape( 'the function supports view offsets', function test( t ) {
 
 	x1 = new Float32Array( x0.buffer, x0.BYTES_PER_ELEMENT*1 ); // start at 2nd element
 	mask1 = new Uint8Array( mask0.buffer, mask0.BYTES_PER_ELEMENT*1 ); // start at 2nd element
-	N = floor( x1.length/2 );
 
-	v = snanmskrange( N, x1, 2, mask1, 2 );
+	v = snanmskrange( 6, x1, 2, mask1, 2 );
 	t.strictEqual( v, 6.0, 'returns expected value' );
 
 	t.end();
diff --git a/lib/node_modules/@stdlib/stats/base/snanmskrange/test/test.snanmskrange.native.js b/lib/node_modules/@stdlib/stats/base/snanmskrange/test/test.snanmskrange.native.js
index 8b95d0c1452a..d415886a6d59 100644
--- a/lib/node_modules/@stdlib/stats/base/snanmskrange/test/test.snanmskrange.native.js
+++ b/lib/node_modules/@stdlib/stats/base/snanmskrange/test/test.snanmskrange.native.js
@@ -22,7 +22,6 @@
 
 var resolve = require( 'path' ).resolve;
 var tape = require( 'tape' );
-var floor = require( '@stdlib/math/base/special/floor' );
 var isnanf = require( '@stdlib/math/base/assert/is-nanf' );
 var isPositiveZerof = require( '@stdlib/math/base/assert/is-positive-zerof' );
 var Float32Array = require( '@stdlib/array/float32' );
@@ -147,7 +146,6 @@ tape( 'if provided an `N` parameter equal to `1`, the function returns `0`', opt
 
 tape( 'the function supports `stride` parameters', opts, function test( t ) {
 	var mask;
-	var N;
 	var x;
 	var v;
 
@@ -180,8 +178,7 @@ tape( 'the function supports `stride` parameters', opts, function test( t ) {
 		0
 	]);
 
-	N = floor( x.length / 2 );
-	v = snanmskrange( N, x, 2, mask, 2 );
+	v = snanmskrange( 6, x, 2, mask, 2 );
 
 	t.strictEqual( v, 6.0, 'returns expected value' );
 	t.end();
@@ -189,7 +186,6 @@ tape( 'the function supports `stride` parameters', opts, function test( t ) {
 
 tape( 'the function supports negative `stride` parameters', opts, function test( t ) {
 	var mask;
-	var N;
 	var x;
 	var v;
 
@@ -222,8 +218,7 @@ tape( 'the function supports negative `stride` parameters', opts, function test(
 		0
 	]);
 
-	N = floor( x.length / 2 );
-	v = snanmskrange( N, x, -2, mask, -2 );
+	v = snanmskrange( 6, x, -2, mask, -2 );
 
 	t.strictEqual( v, 6.0, 'returns expected value' );
 	t.end();
@@ -234,7 +229,6 @@ tape( 'the function supports view offsets', opts, function test( t ) {
 	var mask1;
 	var x0;
 	var x1;
-	var N;
 	var v;
 
 	x0 = new Float32Array([
@@ -270,9 +264,8 @@ tape( 'the function supports view offsets', opts, function test( t ) {
 
 	x1 = new Float32Array( x0.buffer, x0.BYTES_PER_ELEMENT*1 ); // start at 2nd element
 	mask1 = new Uint8Array( mask0.buffer, mask0.BYTES_PER_ELEMENT*1 ); // start at 2nd element
-	N = floor( x1.length/2 );
 
-	v = snanmskrange( N, x1, 2, mask1, 2 );
+	v = snanmskrange( 6, x1, 2, mask1, 2 );
 	t.strictEqual( v, 6.0, 'returns expected value' );
 
 	t.end();