diff --git a/lib/node_modules/@stdlib/ndarray/base/ctor/README.md b/lib/node_modules/@stdlib/ndarray/base/ctor/README.md
index 9197e8929c77..9940b8d06872 100644
--- a/lib/node_modules/@stdlib/ndarray/base/ctor/README.md
+++ b/lib/node_modules/@stdlib/ndarray/base/ctor/README.md
@@ -510,11 +510,44 @@ var d = arr.data;
For zero-dimensional arrays, the first, and **only**, argument should be the value `v` to set. The method returns the `ndarray` instance.
+
+
+#### ndarray.prototype.toLocaleString( \[locales\[, options]] )
+
+Serializes an `ndarray` as a locale-specific string.
+
+```javascript
+// Specify the array configuration:
+var buffer = [ 1234.567, 9876.543, 1111.222, 3333.444 ];
+var shape = [ 2, 2 ];
+var order = 'row-major';
+var strides = [ 2, 1 ];
+var offset = 0;
+
+// Create a new ndarray:
+var arr = ndarray( 'generic', buffer, shape, strides, offset, order );
+
+// Serialize to a locale-specific string:
+var str = arr.toLocaleString( 'en-US' );
+// returns "ndarray( 'generic', [ 1,234.567, 9,876.543, 1,111.222, 3,333.444 ], [ 2, 2 ], [ 2, 1 ], 0, 'row-major' )"
+
+// Use German locale:
+str = arr.toLocaleString( 'de-DE' );
+// returns "ndarray( 'generic', [ 1.234,567, 9.876,543, 1.111,222, 3.333,444 ], [ 2, 2 ], [ 2, 1 ], 0, 'row-major' )"
+```
+
+The method accepts the following arguments:
+
+- **locales**: a string with a BCP 47 language tag or an array of such strings.
+- **options**: configuration properties.
+
+The method does **not** serialize data outside of the buffer region defined by the array configuration.
+
#### ndarray.prototype.toString()
-Serializes an `ndarray` as a `string`.
+Serializes an `ndarray` as a string.
```javascript
// Specify the array configuration:
diff --git a/lib/node_modules/@stdlib/ndarray/base/ctor/benchmark/benchmark.js b/lib/node_modules/@stdlib/ndarray/base/ctor/benchmark/benchmark.js
index 448bd2c01153..bb09b8829c57 100644
--- a/lib/node_modules/@stdlib/ndarray/base/ctor/benchmark/benchmark.js
+++ b/lib/node_modules/@stdlib/ndarray/base/ctor/benchmark/benchmark.js
@@ -21,15 +21,14 @@
// MODULES //
var bench = require( '@stdlib/bench' );
-var randu = require( '@stdlib/random/base/randu' );
-var floor = require( '@stdlib/math/base/special/floor' );
+var format = require( '@stdlib/string/format' );
var pkg = require( './../package.json' ).name;
var ndarray = require( './../lib' );
// MAIN //
-bench( pkg+'::instantiation', function benchmark( b ) {
+bench( format( '%s::instantiation', pkg ), function benchmark( b ) {
var strides;
var buffer;
var offset;
@@ -46,7 +45,7 @@ bench( pkg+'::instantiation', function benchmark( b ) {
b.tic();
for ( i = 0; i < b.iterations; i++ ) {
- buffer[ 0 ] = randu();
+ buffer[ 0 ] = i;
out = ndarray( 'generic', buffer, shape, strides, offset, order );
if ( out.length === 0 ) {
b.fail( 'should have a length greater than 0' );
@@ -60,7 +59,7 @@ bench( pkg+'::instantiation', function benchmark( b ) {
b.end();
});
-bench( pkg+'::instantiation,new', function benchmark( b ) {
+bench( format( '%s::instantiation,new', pkg ), function benchmark( b ) {
var strides;
var buffer;
var offset;
@@ -77,7 +76,7 @@ bench( pkg+'::instantiation,new', function benchmark( b ) {
b.tic();
for ( i = 0; i < b.iterations; i++ ) {
- buffer[ 0 ] = randu();
+ buffer[ 0 ] = i;
out = new ndarray( 'generic', buffer, shape, strides, offset, order );
if ( out.length === 0 ) {
b.fail( 'should have a length greater than 0' );
@@ -91,7 +90,7 @@ bench( pkg+'::instantiation,new', function benchmark( b ) {
b.end();
});
-bench( pkg+'::get:byteLength', function benchmark( b ) {
+bench( format( '%s::get:byteLength', pkg ), function benchmark( b ) {
var strides;
var buffer;
var offset;
@@ -124,7 +123,7 @@ bench( pkg+'::get:byteLength', function benchmark( b ) {
b.end();
});
-bench( pkg+'::get:_byteLength', function benchmark( b ) {
+bench( format( '%s::get:_byteLength', pkg ), function benchmark( b ) {
var strides;
var buffer;
var offset;
@@ -157,7 +156,7 @@ bench( pkg+'::get:_byteLength', function benchmark( b ) {
b.end();
});
-bench( pkg+'::get:BYTES_PER_ELEMENT', function benchmark( b ) {
+bench( format( '%s::get:BYTES_PER_ELEMENT', pkg ), function benchmark( b ) {
var strides;
var buffer;
var offset;
@@ -190,7 +189,7 @@ bench( pkg+'::get:BYTES_PER_ELEMENT', function benchmark( b ) {
b.end();
});
-bench( pkg+'::get:data', function benchmark( b ) {
+bench( format( '%s::get:data', pkg ), function benchmark( b ) {
var strides;
var buffer;
var offset;
@@ -223,7 +222,7 @@ bench( pkg+'::get:data', function benchmark( b ) {
b.end();
});
-bench( pkg+'::get:_buffer', function benchmark( b ) {
+bench( format( '%s::get:_buffer', pkg ), function benchmark( b ) {
var strides;
var buffer;
var offset;
@@ -256,7 +255,7 @@ bench( pkg+'::get:_buffer', function benchmark( b ) {
b.end();
});
-bench( pkg+'::get:dtype', function benchmark( b ) {
+bench( format( '%s::get:dtype', pkg ), function benchmark( b ) {
var strides;
var buffer;
var offset;
@@ -277,19 +276,19 @@ bench( pkg+'::get:dtype', function benchmark( b ) {
b.tic();
for ( i = 0; i < b.iterations; i++ ) {
v = out.dtype;
- if ( v !== 'generic' ) {
+ if ( v === null ) {
b.fail( 'should return expected data type' );
}
}
b.toc();
- if ( v !== 'generic' ) {
+ if ( String( v ) !== 'generic' ) {
b.fail( 'should return expected data type' );
}
b.pass( 'benchmark finished' );
b.end();
});
-bench( pkg+'::get:flags', function benchmark( b ) {
+bench( format( '%s::get:flags', pkg ), function benchmark( b ) {
var strides;
var buffer;
var offset;
@@ -322,7 +321,7 @@ bench( pkg+'::get:flags', function benchmark( b ) {
b.end();
});
-bench( pkg+'::get:_flags', function benchmark( b ) {
+bench( format( '%s::get:_flags', pkg ), function benchmark( b ) {
var strides;
var buffer;
var offset;
@@ -355,7 +354,7 @@ bench( pkg+'::get:_flags', function benchmark( b ) {
b.end();
});
-bench( pkg+'::get:length', function benchmark( b ) {
+bench( format( '%s::get:length', pkg ), function benchmark( b ) {
var strides;
var buffer;
var offset;
@@ -388,7 +387,7 @@ bench( pkg+'::get:length', function benchmark( b ) {
b.end();
});
-bench( pkg+'::get:_length', function benchmark( b ) {
+bench( format( '%s::get:_length', pkg ), function benchmark( b ) {
var strides;
var buffer;
var offset;
@@ -421,7 +420,7 @@ bench( pkg+'::get:_length', function benchmark( b ) {
b.end();
});
-bench( pkg+'::get:ndims', function benchmark( b ) {
+bench( format( '%s::get:ndims', pkg ), function benchmark( b ) {
var strides;
var buffer;
var offset;
@@ -454,7 +453,7 @@ bench( pkg+'::get:ndims', function benchmark( b ) {
b.end();
});
-bench( pkg+'::get:offset', function benchmark( b ) {
+bench( format( '%s::get:offset', pkg ), function benchmark( b ) {
var strides;
var buffer;
var offset;
@@ -487,7 +486,7 @@ bench( pkg+'::get:offset', function benchmark( b ) {
b.end();
});
-bench( pkg+'::get:_offset', function benchmark( b ) {
+bench( format( '%s::get:_offset', pkg ), function benchmark( b ) {
var strides;
var buffer;
var offset;
@@ -520,7 +519,7 @@ bench( pkg+'::get:_offset', function benchmark( b ) {
b.end();
});
-bench( pkg+'::get:order', function benchmark( b ) {
+bench( format( '%s::get:order', pkg ), function benchmark( b ) {
var strides;
var buffer;
var offset;
@@ -553,7 +552,7 @@ bench( pkg+'::get:order', function benchmark( b ) {
b.end();
});
-bench( pkg+'::get:_order', function benchmark( b ) {
+bench( format( '%s::get:_order', pkg ), function benchmark( b ) {
var strides;
var buffer;
var offset;
@@ -586,7 +585,7 @@ bench( pkg+'::get:_order', function benchmark( b ) {
b.end();
});
-bench( pkg+'::get:shape', function benchmark( b ) {
+bench( format( '%s::get:shape', pkg ), function benchmark( b ) {
var strides;
var buffer;
var offset;
@@ -619,7 +618,7 @@ bench( pkg+'::get:shape', function benchmark( b ) {
b.end();
});
-bench( pkg+'::get:_shape', function benchmark( b ) {
+bench( format( '%s::get:_shape', pkg ), function benchmark( b ) {
var strides;
var buffer;
var offset;
@@ -652,7 +651,7 @@ bench( pkg+'::get:_shape', function benchmark( b ) {
b.end();
});
-bench( pkg+'::get:strides', function benchmark( b ) {
+bench( format( '%s::get:strides', pkg ), function benchmark( b ) {
var strides;
var buffer;
var offset;
@@ -685,7 +684,7 @@ bench( pkg+'::get:strides', function benchmark( b ) {
b.end();
});
-bench( pkg+'::get:_strides', function benchmark( b ) {
+bench( format( '%s::get:_strides', pkg ), function benchmark( b ) {
var strides;
var buffer;
var offset;
@@ -718,7 +717,7 @@ bench( pkg+'::get:_strides', function benchmark( b ) {
b.end();
});
-bench( pkg+':get', function benchmark( b ) {
+bench( format( '%s:get', pkg ), function benchmark( b ) {
var strides;
var buffer;
var offset;
@@ -738,8 +737,8 @@ bench( pkg+':get', function benchmark( b ) {
b.tic();
for ( i = 0; i < b.iterations; i++ ) {
- buffer[ 1 ] = randu();
- v = out.get( floor( randu()*3.0 ), 1 );
+ buffer[ 1 ] = i;
+ v = out.get( i%3, 1 );
if ( v !== v ) {
b.fail( 'should not return NaN' );
}
@@ -752,7 +751,7 @@ bench( pkg+':get', function benchmark( b ) {
b.end();
});
-bench( pkg+'::all_positive_strides:iget:order=row-major', function benchmark( b ) {
+bench( format( '%s::all_positive_strides:iget:order=row-major', pkg ), function benchmark( b ) {
var strides;
var buffer;
var offset;
@@ -772,8 +771,8 @@ bench( pkg+'::all_positive_strides:iget:order=row-major', function benchmark( b
b.tic();
for ( i = 0; i < b.iterations; i++ ) {
- buffer[ 1 ] = randu();
- v = out.iget( floor( randu()*4.0 ) );
+ buffer[ 1 ] = i;
+ v = out.iget( i%4 );
if ( v !== v ) {
b.fail( 'should not return NaN' );
}
@@ -786,7 +785,7 @@ bench( pkg+'::all_positive_strides:iget:order=row-major', function benchmark( b
b.end();
});
-bench( pkg+'::all_positive_strides:iget:order=column-major', function benchmark( b ) {
+bench( format( '%s::all_positive_strides:iget:order=column-major', pkg ), function benchmark( b ) {
var strides;
var buffer;
var offset;
@@ -806,8 +805,8 @@ bench( pkg+'::all_positive_strides:iget:order=column-major', function benchmark(
b.tic();
for ( i = 0; i < b.iterations; i++ ) {
- buffer[ 1 ] = randu();
- v = out.iget( floor( randu()*4.0 ) );
+ buffer[ 1 ] = i;
+ v = out.iget( i%4 );
if ( v !== v ) {
b.fail( 'should not return NaN' );
}
@@ -820,7 +819,7 @@ bench( pkg+'::all_positive_strides:iget:order=column-major', function benchmark(
b.end();
});
-bench( pkg+'::all_negative_strides:iget:order=row-major', function benchmark( b ) {
+bench( format( '%s::all_negative_strides:iget:order=row-major', pkg ), function benchmark( b ) {
var strides;
var buffer;
var offset;
@@ -840,8 +839,8 @@ bench( pkg+'::all_negative_strides:iget:order=row-major', function benchmark( b
b.tic();
for ( i = 0; i < b.iterations; i++ ) {
- buffer[ 1 ] = randu();
- v = out.iget( floor( randu()*4.0 ) );
+ buffer[ 1 ] = i;
+ v = out.iget( i%4 );
if ( v !== v ) {
b.fail( 'should not return NaN' );
}
@@ -854,7 +853,7 @@ bench( pkg+'::all_negative_strides:iget:order=row-major', function benchmark( b
b.end();
});
-bench( pkg+'::all_negative_strides:iget:order=column-major', function benchmark( b ) {
+bench( format( '%s::all_negative_strides:iget:order=column-major', pkg ), function benchmark( b ) {
var strides;
var buffer;
var offset;
@@ -874,8 +873,8 @@ bench( pkg+'::all_negative_strides:iget:order=column-major', function benchmark(
b.tic();
for ( i = 0; i < b.iterations; i++ ) {
- buffer[ 1 ] = randu();
- v = out.iget( floor( randu()*4.0 ) );
+ buffer[ 1 ] = i;
+ v = out.iget( i%4 );
if ( v !== v ) {
b.fail( 'should not return NaN' );
}
@@ -888,7 +887,7 @@ bench( pkg+'::all_negative_strides:iget:order=column-major', function benchmark(
b.end();
});
-bench( pkg+'::mixed_sign_strides:iget:order=row-major', function benchmark( b ) {
+bench( format( '%s::mixed_sign_strides:iget:order=row-major', pkg ), function benchmark( b ) {
var strides;
var buffer;
var offset;
@@ -908,8 +907,8 @@ bench( pkg+'::mixed_sign_strides:iget:order=row-major', function benchmark( b )
b.tic();
for ( i = 0; i < b.iterations; i++ ) {
- buffer[ 1 ] = randu();
- v = out.iget( floor( randu()*4.0 ) );
+ buffer[ 1 ] = i;
+ v = out.iget( i%4 );
if ( v !== v ) {
b.fail( 'should not return NaN' );
}
@@ -922,7 +921,7 @@ bench( pkg+'::mixed_sign_strides:iget:order=row-major', function benchmark( b )
b.end();
});
-bench( pkg+'::mixed_sign_strides:iget:order=column-major', function benchmark( b ) {
+bench( format( '%s::mixed_sign_strides:iget:order=column-major', pkg ), function benchmark( b ) {
var strides;
var buffer;
var offset;
@@ -942,8 +941,8 @@ bench( pkg+'::mixed_sign_strides:iget:order=column-major', function benchmark( b
b.tic();
for ( i = 0; i < b.iterations; i++ ) {
- buffer[ 1 ] = randu();
- v = out.iget( floor( randu()*4.0 ) );
+ buffer[ 1 ] = i;
+ v = out.iget( i%4 );
if ( v !== v ) {
b.fail( 'should not return NaN' );
}
@@ -956,14 +955,13 @@ bench( pkg+'::mixed_sign_strides:iget:order=column-major', function benchmark( b
b.end();
});
-bench( pkg+':set', function benchmark( b ) {
+bench( format( '%s:set', pkg ), function benchmark( b ) {
var strides;
var buffer;
var offset;
var shape;
var order;
var out;
- var v;
var i;
var j;
@@ -977,29 +975,27 @@ bench( pkg+':set', function benchmark( b ) {
b.tic();
for ( i = 0; i < b.iterations; i++ ) {
- v = randu();
- j = floor( randu()*3.0 );
- out.set( j, 1, v );
- if ( buffer[ (2*j) + (1*1) ] !== v ) {
+ j = i%3;
+ out.set( j, 1, i );
+ if ( buffer[ (2*j) + (1*1) ] !== i ) {
b.fail( 'should set value' );
}
}
b.toc();
- if ( buffer[ (2*j) + 1 ] !== v ) {
+ if ( buffer[ (2*j) + 1 ] !== i-1 ) {
b.fail( 'should set value' );
}
b.pass( 'benchmark finished' );
b.end();
});
-bench( pkg+'::all_positive_strides:iset:order=row-major', function benchmark( b ) {
+bench( format( '%s::all_positive_strides:iset:order=row-major', pkg ), function benchmark( b ) {
var strides;
var buffer;
var offset;
var shape;
var order;
var out;
- var v;
var i;
var j;
@@ -1013,29 +1009,27 @@ bench( pkg+'::all_positive_strides:iset:order=row-major', function benchmark( b
b.tic();
for ( i = 0; i < b.iterations; i++ ) {
- v = randu();
- j = floor( randu()*4.0 );
- out.iset( j, v );
- if ( buffer[ j ] !== v ) {
+ j = i%4;
+ out.iset( j, i );
+ if ( buffer[ j ] !== i ) {
b.fail( 'should set value' );
}
}
b.toc();
- if ( buffer[ j ] !== v ) {
+ if ( buffer[ j ] !== i-1 ) {
b.fail( 'should set value' );
}
b.pass( 'benchmark finished' );
b.end();
});
-bench( pkg+'::all_positive_strides:iset:order=column-major', function benchmark( b ) {
+bench( format( '%s::all_positive_strides:iset:order=column-major', pkg ), function benchmark( b ) {
var strides;
var buffer;
var offset;
var shape;
var order;
var out;
- var v;
var i;
var j;
@@ -1049,29 +1043,27 @@ bench( pkg+'::all_positive_strides:iset:order=column-major', function benchmark(
b.tic();
for ( i = 0; i < b.iterations; i++ ) {
- v = randu();
- j = floor( randu()*4.0 );
- out.iset( j, v );
- if ( buffer[ j ] !== v ) {
+ j = i%4;
+ out.iset( j, i );
+ if ( buffer[ j ] !== i ) {
b.fail( 'should set value' );
}
}
b.toc();
- if ( buffer[ j ] !== v ) {
+ if ( buffer[ j ] !== i-1 ) {
b.fail( 'should set value' );
}
b.pass( 'benchmark finished' );
b.end();
});
-bench( pkg+'::all_negative_strides:iset:order=row-major', function benchmark( b ) {
+bench( format( '%s::all_negative_strides:iset:order=row-major', pkg ), function benchmark( b ) {
var strides;
var buffer;
var offset;
var shape;
var order;
var out;
- var v;
var i;
var j;
@@ -1085,29 +1077,27 @@ bench( pkg+'::all_negative_strides:iset:order=row-major', function benchmark( b
b.tic();
for ( i = 0; i < b.iterations; i++ ) {
- v = randu();
- j = floor( randu()*4.0 );
- out.iset( j, v );
- if ( buffer[ 3-j ] !== v ) {
+ j = i%4;
+ out.iset( j, i );
+ if ( buffer[ 3-j ] !== i ) {
b.fail( 'should set value' );
}
}
b.toc();
- if ( buffer[ 3-j ] !== v ) {
+ if ( buffer[ 3-j ] !== i-1 ) {
b.fail( 'should set value' );
}
b.pass( 'benchmark finished' );
b.end();
});
-bench( pkg+'::all_negative_strides:iset:order=column-major', function benchmark( b ) {
+bench( format( '%s::all_negative_strides:iset:order=column-major', pkg ), function benchmark( b ) {
var strides;
var buffer;
var offset;
var shape;
var order;
var out;
- var v;
var i;
var j;
@@ -1121,31 +1111,28 @@ bench( pkg+'::all_negative_strides:iset:order=column-major', function benchmark(
b.tic();
for ( i = 0; i < b.iterations; i++ ) {
- v = randu();
- j = floor( randu()*4.0 );
- out.iset( j, v );
- if ( buffer[ 3-j ] !== v ) {
+ j = i%4;
+ out.iset( j, i );
+ if ( buffer[ 3-j ] !== i ) {
b.fail( 'should set value' );
}
}
b.toc();
- if ( buffer[ 3-j ] !== v ) {
+ if ( buffer[ 3-j ] !== i-1 ) {
b.fail( 'should set value' );
}
b.pass( 'benchmark finished' );
b.end();
});
-bench( pkg+'::mixed_sign_strides:iset:order=row-major', function benchmark( b ) {
+bench( format( '%s::mixed_sign_strides:iset:order=row-major', pkg ), function benchmark( b ) {
var strides;
var buffer;
var offset;
var shape;
var order;
var out;
- var v;
var i;
- var j;
buffer = [ 1.0, 2.0, 3.0, 4.0, 5.0, 6.0 ];
shape = [ 3, 2 ];
@@ -1157,31 +1144,27 @@ bench( pkg+'::mixed_sign_strides:iset:order=row-major', function benchmark( b )
b.tic();
for ( i = 0; i < b.iterations; i++ ) {
- v = randu();
- j = floor( randu()*4.0 );
- out.iset( j, v );
+ out.iset( i%4, i );
if ( buffer[ 0 ] !== buffer[ 0 ] ) {
b.fail( 'should not be NaN' );
}
}
b.toc();
- if ( out.iget( j ) !== v ) {
+ if ( out.iget( (i-1)%4 ) !== i-1 ) {
b.fail( 'should set value' );
}
b.pass( 'benchmark finished' );
b.end();
});
-bench( pkg+'::mixed_sign_strides:iset:order=column-major', function benchmark( b ) {
+bench( format( '%s::mixed_sign_strides:iset:order=column-major', pkg ), function benchmark( b ) {
var strides;
var buffer;
var offset;
var shape;
var order;
var out;
- var v;
var i;
- var j;
buffer = [ 1.0, 2.0, 3.0, 4.0, 5.0, 6.0 ];
shape = [ 3, 2 ];
@@ -1193,22 +1176,20 @@ bench( pkg+'::mixed_sign_strides:iset:order=column-major', function benchmark( b
b.tic();
for ( i = 0; i < b.iterations; i++ ) {
- v = randu();
- j = floor( randu()*4.0 );
- out.iset( j, v );
+ out.iset( i%4, i );
if ( buffer[ 0 ] !== buffer[ 0 ] ) {
b.fail( 'should not be NaN' );
}
}
b.toc();
- if ( out.iget( j ) !== v ) {
+ if ( out.iget( (i-1)%4 ) !== i-1 ) {
b.fail( 'should set value' );
}
b.pass( 'benchmark finished' );
b.end();
});
-bench( pkg+':toJSON', function benchmark( b ) {
+bench( format( '%s:toJSON', pkg ), function benchmark( b ) {
var strides;
var buffer;
var offset;
@@ -1228,7 +1209,7 @@ bench( pkg+':toJSON', function benchmark( b ) {
b.tic();
for ( i = 0; i < b.iterations; i++ ) {
- buffer[ 1 ] = randu();
+ buffer[ 1 ] = i;
v = out.toJSON();
if ( typeof v !== 'object' ) {
b.fail( 'should return an object' );
@@ -1242,7 +1223,41 @@ bench( pkg+':toJSON', function benchmark( b ) {
b.end();
});
-bench( pkg+':toString', function benchmark( b ) {
+bench( format( '%s:toLocaleString', pkg ), function benchmark( b ) {
+ var strides;
+ var buffer;
+ var offset;
+ var shape;
+ var order;
+ var out;
+ var v;
+ var i;
+
+ buffer = [ 1.0, 2.0, 3.0, 4.0, 5.0, 6.0 ];
+ shape = [ 3, 2 ];
+ strides = [ 2, 1 ];
+ offset = 0;
+ order = 'row-major';
+
+ out = ndarray( 'generic', buffer, shape, strides, offset, order );
+
+ b.tic();
+ for ( i = 0; i < b.iterations; i++ ) {
+ buffer[ 1 ] = i;
+ v = out.toLocaleString();
+ if ( typeof v !== 'string' ) {
+ b.fail( 'should return a string' );
+ }
+ }
+ b.toc();
+ if ( typeof v !== 'string' ) {
+ b.fail( 'should return a string' );
+ }
+ b.pass( 'benchmark finished' );
+ b.end();
+});
+
+bench( format( '%s:toString', pkg ), function benchmark( b ) {
var strides;
var buffer;
var offset;
@@ -1262,7 +1277,7 @@ bench( pkg+':toString', function benchmark( b ) {
b.tic();
for ( i = 0; i < b.iterations; i++ ) {
- buffer[ 1 ] = randu();
+ buffer[ 1 ] = i;
v = out.toString();
if ( typeof v !== 'string' ) {
b.fail( 'should return a string' );
@@ -1276,7 +1291,7 @@ bench( pkg+':toString', function benchmark( b ) {
b.end();
});
-bench( pkg+':valueOf:ndims=0', function benchmark( b ) {
+bench( format( '%s:valueOf:ndims=0', pkg ), function benchmark( b ) {
var strides;
var buffer;
var offset;
@@ -1310,7 +1325,7 @@ bench( pkg+':valueOf:ndims=0', function benchmark( b ) {
b.end();
});
-bench( pkg+':valueOf:ndims>=1', function benchmark( b ) {
+bench( format( '%s:valueOf:ndims>=1', pkg ), function benchmark( b ) {
var strides;
var buffer;
var offset;
diff --git a/lib/node_modules/@stdlib/ndarray/base/ctor/docs/repl.txt b/lib/node_modules/@stdlib/ndarray/base/ctor/docs/repl.txt
index ba02ec05bea4..7735a40a4c6c 100644
--- a/lib/node_modules/@stdlib/ndarray/base/ctor/docs/repl.txt
+++ b/lib/node_modules/@stdlib/ndarray/base/ctor/docs/repl.txt
@@ -38,10 +38,10 @@
Examples
--------
// Create a new instance...
- > var b = [ 1, 2, 3, 4 ]; // underlying data buffer
- > var d = [ 2, 2 ]; // shape
- > var s = [ 2, 1 ]; // strides
- > var o = 0; // index offset
+ > var b = [ 1, 2, 3, 4 ];
+ > var d = [ 2, 2 ];
+ > var s = [ 2, 1 ];
+ > var o = 0;
> var arr = {{alias}}( 'generic', b, d, s, o, 'row-major' )
@@ -397,6 +397,36 @@
-4.0
+{{alias}}.prototype.toLocaleString( [locales[, options]] )
+ Serializes an ndarray as a locale-aware string.
+
+ This method does **not** serialize data outside of the buffer region defined
+ by the array configuration.
+
+ Parameters
+ ----------
+ locales: string|Array (optional)
+ Locale identifier(s).
+
+ options: Object (optional)
+ Configuration options.
+
+ Returns
+ -------
+ str: string
+ Serialized ndarray string.
+
+ Examples
+ --------
+ > var b = [ 1, 2, 3, 4 ];
+ > var d = [ 2, 2 ];
+ > var s = [ 2, 1 ];
+ > var o = 0;
+ > var arr = {{alias}}( 'generic', b, d, s, o, 'row-major' );
+ > arr.toLocaleString()
+ '...'
+
+
{{alias}}.prototype.toString()
Serializes an ndarray as a string.
diff --git a/lib/node_modules/@stdlib/ndarray/base/ctor/lib/main.js b/lib/node_modules/@stdlib/ndarray/base/ctor/lib/main.js
index f99d708056fb..48f19aa76f8b 100644
--- a/lib/node_modules/@stdlib/ndarray/base/ctor/lib/main.js
+++ b/lib/node_modules/@stdlib/ndarray/base/ctor/lib/main.js
@@ -41,6 +41,7 @@ var getValue = require( './get.js' );
var valueOf = require( './valueof.js' ); // eslint-disable-line stdlib/no-redeclare
var toJSON = require( './tojson.js' );
var toString = require( './tostring.js' ); // eslint-disable-line stdlib/no-redeclare
+var toLocaleString = require( './tolocalestring.js' ); // eslint-disable-line stdlib/no-redeclare
var meta2dataview = require( './meta2dataview.js' );
var meta2dataviewPolyfill = require( './meta2dataview.polyfill.js' );
@@ -544,6 +545,35 @@ setReadOnly( ndarray.prototype, 'iset', isetValue );
*/
setReadOnly( ndarray.prototype, 'toString', toString );
+/**
+* Serializes an ndarray as a locale-aware string.
+*
+* ## Notes
+*
+* - The method does **not** serialize data outside of the buffer region defined by the array configuration.
+*
+* @name toLocaleString
+* @memberof ndarray.prototype
+* @type {Function}
+* @param {(string|Array)} [locales] - locale identifier(s)
+* @param {Object} [options] - configuration options
+* @throws {TypeError} first argument must be a string or an array of strings
+* @throws {TypeError} options argument must be an object
+* @returns {string} string representation
+*
+* @example
+* var buffer = [ 1234.567, 9876.543, 1111.222, 3333.444 ];
+* var shape = [ 2, 2 ];
+* var strides = [ 2, 1 ];
+* var offset = 0;
+*
+* var x = ndarray( 'generic', buffer, shape, strides, offset, 'row-major' );
+*
+* var str = x.toLocaleString( 'en-US' );
+* // returns "ndarray( 'generic', [ 1,234.567, 9,876.543, 1,111.222, 3,333.444 ], [ 2, 2 ], [ 2, 1 ], 0, 'row-major' )"
+*/
+setReadOnly( ndarray.prototype, 'toLocaleString', toLocaleString );
+
/**
* Serializes an ndarray as a JSON object.
*
diff --git a/lib/node_modules/@stdlib/ndarray/base/ctor/lib/tojson.js b/lib/node_modules/@stdlib/ndarray/base/ctor/lib/tojson.js
index 9429edb97ceb..c88e918716ab 100644
--- a/lib/node_modules/@stdlib/ndarray/base/ctor/lib/tojson.js
+++ b/lib/node_modules/@stdlib/ndarray/base/ctor/lib/tojson.js
@@ -20,6 +20,7 @@
// MODULES //
+var isComplexDataType = require( '@stdlib/ndarray/base/assert/is-complex-floating-point-data-type' );
var real = require( '@stdlib/complex/float64/real' );
var imag = require( '@stdlib/complex/float64/imag' );
@@ -64,7 +65,7 @@ function toJSON() {
}
// Cast data to generic array...
out.data = [];
- if ( out.dtype === 'complex64' || out.dtype === 'complex128' ) {
+ if ( isComplexDataType( out.dtype ) ) {
for ( i = 0; i < len; i++ ) {
v = this.iget( i );
out.data.push( real( v ), imag( v ) );
diff --git a/lib/node_modules/@stdlib/ndarray/base/ctor/lib/tolocalestring.js b/lib/node_modules/@stdlib/ndarray/base/ctor/lib/tolocalestring.js
new file mode 100644
index 000000000000..4be8a7a25deb
--- /dev/null
+++ b/lib/node_modules/@stdlib/ndarray/base/ctor/lib/tolocalestring.js
@@ -0,0 +1,209 @@
+/**
+* @license Apache-2.0
+*
+* Copyright (c) 2026 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.
+*/
+
+'use strict';
+
+// MODULES //
+
+var isComplexDataType = require( '@stdlib/ndarray/base/assert/is-complex-floating-point-data-type' );
+var isString = require( '@stdlib/assert/is-string' ).isPrimitive;
+var isStringArray = require( '@stdlib/assert/is-string-array' ).primitives;
+var isObject = require( '@stdlib/assert/is-plain-object' );
+var format = require( '@stdlib/string/format' );
+var replace = require( '@stdlib/string/replace' );
+var join = require( '@stdlib/array/base/join' );
+var real = require( '@stdlib/complex/float64/real' );
+var imag = require( '@stdlib/complex/float64/imag' );
+
+
+// VARIABLES //
+
+var CTORS = {
+ 'int8': 'new Int8Array( [ {{data}} ] )',
+ 'uint8': 'new Uint8Array( [ {{data}} ] )',
+ 'uint8c': 'new Uint8ClampedArray( [ {{data}} ] )',
+ 'int16': 'new Int16Array( [ {{data}} ] )',
+ 'uint16': 'new Uint16Array( [ {{data}} ] )',
+ 'int32': 'new Int32Array( [ {{data}} ] )',
+ 'uint32': 'new Uint32Array( [ {{data}} ] )',
+ 'float32': 'new Float32Array( [ {{data}} ] )',
+ 'float64': 'new Float64Array( [ {{data}} ] )',
+ 'generic': '[ {{data}} ]',
+ 'binary': 'new Buffer( [ {{data}} ] )',
+ 'complex64': 'new Complex64Array( [ {{data}} ] )',
+ 'complex128': 'new Complex128Array( [ {{data}} ] )',
+ 'bool': 'new BooleanArray( [ {{data}} ] )'
+};
+
+
+// MAIN //
+
+/**
+* Serializes an ndarray as a locale-aware string.
+*
+* ## Notes
+*
+* - The method does **not** serialize data outside of the buffer region defined by the array configuration.
+*
+* @private
+* @param {(string|Array)} [locales] - locale identifier(s)
+* @param {Object} [options] - configuration options
+* @throws {TypeError} first argument must be a string or an array of strings
+* @throws {TypeError} options argument must be an object
+* @returns {string} string representation
+*/
+function toLocaleString( locales, options ) { // eslint-disable-line stdlib/no-redeclare
+ /* eslint-disable no-invalid-this */
+ var isCmplx;
+ var buffer;
+ var ndims;
+ var ctor;
+ var opts;
+ var loc;
+ var str;
+ var dt;
+ var v;
+ var i;
+
+ if ( arguments.length === 0 ) {
+ loc = [];
+ } else if ( isString( locales ) || isStringArray( locales ) ) {
+ loc = locales;
+ } else {
+ throw new TypeError( format( 'invalid argument. First argument must be a string or an array of strings. Value: `%s`.', locales ) );
+ }
+ if ( arguments.length < 2 ) {
+ opts = {};
+ } else if ( isObject( options ) ) {
+ opts = options;
+ } else {
+ throw new TypeError( format( 'invalid argument. Options argument must be an object. Value: `%s`.', options ) );
+ }
+ ndims = this._shape.length;
+ dt = this._dtype;
+ isCmplx = isComplexDataType( dt );
+
+ // Function to invoke to create an ndarray:
+ str = format( 'ndarray( \'%s\', ', String( dt ) );
+
+ // Data buffer parameter...
+ buffer = '';
+ if ( this._length <= 100 ) {
+ if ( isCmplx ) {
+ for ( i = 0; i < this._length; i++ ) {
+ v = this.iget( i );
+ buffer += real( v ).toLocaleString( loc, opts ) + ', ' + imag( v ).toLocaleString( loc, opts );
+ if ( i < this._length-1 ) {
+ buffer += ', ';
+ }
+ }
+ } else {
+ for ( i = 0; i < this._length; i++ ) {
+ buffer += this.iget( i ).toLocaleString( loc, opts );
+ if ( i < this._length-1 ) {
+ buffer += ', ';
+ }
+ }
+ }
+ } else {
+ // First three values...
+ if ( isCmplx ) {
+ for ( i = 0; i < 3; i++ ) {
+ v = this.iget( i );
+ buffer += real( v ).toLocaleString( loc, opts ) + ', ' + imag( v ).toLocaleString( loc, opts );
+ if ( i < 2 ) {
+ buffer += ', ';
+ }
+ }
+ } else {
+ for ( i = 0; i < 3; i++ ) {
+ buffer += this.iget( i ).toLocaleString( loc, opts );
+ if ( i < 2 ) {
+ buffer += ', ';
+ }
+ }
+ }
+ buffer += ', ..., ';
+
+ // Last three values...
+ if ( isCmplx ) {
+ for ( i = 2; i >= 0; i-- ) {
+ v = this.iget( this._length-1-i );
+ buffer += real( v ).toLocaleString( loc, opts ) + ', ' + imag( v ).toLocaleString( loc, opts );
+ if ( i > 0 ) {
+ buffer += ', ';
+ }
+ }
+ } else {
+ for ( i = 2; i >= 0; i-- ) {
+ buffer += this.iget( this._length-1-i ).toLocaleString( loc, opts ); // eslint-disable-line max-len
+ if ( i > 0 ) {
+ buffer += ', ';
+ }
+ }
+ }
+ }
+ ctor = CTORS[ this.dtype ];
+ str += replace( ctor, '{{data}}', buffer );
+ str += ', ';
+
+ // Array shape...
+ if ( ndims === 0 ) {
+ str += '[]';
+ } else {
+ str += format( '[ %s ]', join( this._shape, ', ' ) );
+ }
+ str += ', ';
+
+ // Stride array...
+ str += '[ ';
+ if ( ndims === 0 ) {
+ str += '0';
+ } else {
+ for ( i = 0; i < ndims; i++ ) {
+ if ( this._strides[ i ] < 0 ) {
+ str += -this._strides[ i ];
+ } else {
+ str += this._strides[ i ];
+ }
+ if ( i < ndims-1 ) {
+ str += ', ';
+ }
+ }
+ }
+ str += ' ]';
+ str += ', ';
+
+ // Buffer offset:
+ str += '0';
+ str += ', ';
+
+ // Order:
+ str += format( '\'%s\'', this._order );
+
+ // Close the function call:
+ str += ' )';
+ return str;
+
+ /* eslint-enable no-invalid-this */
+}
+
+
+// EXPORTS //
+
+module.exports = toLocaleString;
diff --git a/lib/node_modules/@stdlib/ndarray/base/ctor/lib/tostring.js b/lib/node_modules/@stdlib/ndarray/base/ctor/lib/tostring.js
index 29df939b0ab6..653d7b7a58d8 100644
--- a/lib/node_modules/@stdlib/ndarray/base/ctor/lib/tostring.js
+++ b/lib/node_modules/@stdlib/ndarray/base/ctor/lib/tostring.js
@@ -18,33 +18,6 @@
'use strict';
-// MODULES //
-
-var replace = require( '@stdlib/string/replace' );
-var real = require( '@stdlib/complex/float64/real' );
-var imag = require( '@stdlib/complex/float64/imag' );
-
-
-// VARIABLES //
-
-var CTORS = {
- 'int8': 'new Int8Array( [ {{data}} ] )',
- 'uint8': 'new Uint8Array( [ {{data}} ] )',
- 'uint8c': 'new Uint8ClampedArray( [ {{data}} ] )',
- 'int16': 'new Int16Array( [ {{data}} ] )',
- 'uint16': 'new Uint16Array( [ {{data}} ] )',
- 'int32': 'new Int32Array( [ {{data}} ] )',
- 'uint32': 'new Uint32Array( [ {{data}} ] )',
- 'float32': 'new Float32Array( [ {{data}} ] )',
- 'float64': 'new Float64Array( [ {{data}} ] )',
- 'generic': '[ {{data}} ]',
- 'binary': 'new Buffer( [ {{data}} ] )',
- 'complex64': 'new Complex64Array( [ {{data}} ] )',
- 'complex128': 'new Complex128Array( [ {{data}} ] )',
- 'bool': 'new BooleanArray( [ {{data}} ] )'
-};
-
-
// MAIN //
/**
@@ -59,118 +32,7 @@ var CTORS = {
*/
function toString() { // eslint-disable-line stdlib/no-redeclare
/* eslint-disable no-invalid-this */
- var buffer;
- var ndims;
- var ctor;
- var str;
- var dt;
- var v;
- var i;
-
- ndims = this._shape.length;
- dt = this._dtype;
-
- // Function to invoke to create an ndarray:
- str = 'ndarray( \''+dt+'\', ';
-
- // Data buffer parameter...
- buffer = '';
- if ( this._length <= 100 ) {
- if ( dt === 'complex64' || dt === 'complex128' ) {
- for ( i = 0; i < this._length; i++ ) {
- v = this.iget( i );
- buffer += real( v ) + ', ' + imag( v );
- if ( i < this._length-1 ) {
- buffer += ', ';
- }
- }
- } else {
- for ( i = 0; i < this._length; i++ ) {
- buffer += this.iget( i );
- if ( i < this._length-1 ) {
- buffer += ', ';
- }
- }
- }
- } else {
- // First three values...
- if ( dt === 'complex64' || dt === 'complex128' ) {
- for ( i = 0; i < 3; i++ ) {
- v = this.iget( i );
- buffer += real( v ) + ', ' + imag( v );
- if ( i < 2 ) {
- buffer += ', ';
- }
- }
- } else {
- for ( i = 0; i < 3; i++ ) {
- buffer += this.iget( i );
- if ( i < 2 ) {
- buffer += ', ';
- }
- }
- }
- buffer += ', ..., ';
-
- // Last three values...
- if ( dt === 'complex64' || dt === 'complex128' ) {
- for ( i = 2; i >= 0; i-- ) {
- v = this.iget( this._length-1-i );
- buffer += real( v ) + ', ' + imag( v );
- if ( i > 0 ) {
- buffer += ', ';
- }
- }
- } else {
- for ( i = 2; i >= 0; i-- ) {
- buffer += this.iget( this._length-1-i );
- if ( i > 0 ) {
- buffer += ', ';
- }
- }
- }
- }
- ctor = CTORS[ this.dtype ];
- str += replace( ctor, '{{data}}', buffer );
- str += ', ';
-
- // Array shape...
- if ( ndims === 0 ) {
- str += '[]';
- } else {
- str += '[ ' + this._shape.join( ', ' ) + ' ]';
- }
- str += ', ';
-
- // Stride array...
- str += '[ ';
- if ( ndims === 0 ) {
- str += '0';
- } else {
- for ( i = 0; i < ndims; i++ ) {
- if ( this._strides[ i ] < 0 ) {
- str += -this._strides[ i ];
- } else {
- str += this._strides[ i ];
- }
- if ( i < ndims-1 ) {
- str += ', ';
- }
- }
- }
- str += ' ]';
- str += ', ';
-
- // Buffer offset:
- str += '0';
- str += ', ';
-
- // Order:
- str += '\'' + this._order + '\'';
-
- // Close the function call:
- str += ' )';
- return str;
+ return this.toLocaleString();
/* eslint-enable no-invalid-this */
}
diff --git a/lib/node_modules/@stdlib/ndarray/base/ctor/test/test.js b/lib/node_modules/@stdlib/ndarray/base/ctor/test/test.js
index e8bca1e8ffc7..1289494b103e 100644
--- a/lib/node_modules/@stdlib/ndarray/base/ctor/test/test.js
+++ b/lib/node_modules/@stdlib/ndarray/base/ctor/test/test.js
@@ -3446,7 +3446,7 @@ tape( 'an ndarray has a custom `toString()` method (complex type)', function tes
t.end();
});
-tape( 'an ndarray has a custom `toString()` method (boolean type)', function test( t ) {
+tape( 'an ndarray has a custom `toString()` method (complex type)', function test( t ) {
var expected;
var strides;
var actual;
@@ -3457,8 +3457,8 @@ tape( 'an ndarray has a custom `toString()` method (boolean type)', function tes
var shape;
var arr;
- dtype = 'bool';
- buffer = new BooleanArray( [ true, false, true, false ] );
+ dtype = 'complex128';
+ buffer = new Complex128Array( [ 1.0, 2.0, 3.0, 4.0, 5.0, 6.0, 7.0, 8.0 ] );
shape = [ 2, 2 ];
order = 'row-major';
strides = [ 2, 1 ];
@@ -3470,14 +3470,14 @@ tape( 'an ndarray has a custom `toString()` method (boolean type)', function tes
t.strictEqual( hasProp( arr, 'toString' ), true, 'has property' );
t.strictEqual( isFunction( arr.toString ), true, 'has method' );
- expected = 'ndarray( \'bool\', new BooleanArray( [ true, false, true, false ] ), [ 2, 2 ], [ 2, 1 ], 0, \'row-major\' )';
+ expected = 'ndarray( \'complex128\', new Complex128Array( [ 1, 2, 3, 4, 5, 6, 7, 8 ] ), [ 2, 2 ], [ 2, 1 ], 0, \'row-major\' )';
actual = arr.toString();
t.strictEqual( actual, expected, 'returns expected value' );
t.end();
});
-tape( 'an ndarray has a custom `toString()` method (complex type)', function test( t ) {
+tape( 'an ndarray has a custom `toString()` method (boolean type)', function test( t ) {
var expected;
var strides;
var actual;
@@ -3488,8 +3488,8 @@ tape( 'an ndarray has a custom `toString()` method (complex type)', function tes
var shape;
var arr;
- dtype = 'complex128';
- buffer = new Complex128Array( [ 1.0, 2.0, 3.0, 4.0, 5.0, 6.0, 7.0, 8.0 ] );
+ dtype = 'bool';
+ buffer = new BooleanArray( [ true, false, true, false ] );
shape = [ 2, 2 ];
order = 'row-major';
strides = [ 2, 1 ];
@@ -3501,7 +3501,7 @@ tape( 'an ndarray has a custom `toString()` method (complex type)', function tes
t.strictEqual( hasProp( arr, 'toString' ), true, 'has property' );
t.strictEqual( isFunction( arr.toString ), true, 'has method' );
- expected = 'ndarray( \'complex128\', new Complex128Array( [ 1, 2, 3, 4, 5, 6, 7, 8 ] ), [ 2, 2 ], [ 2, 1 ], 0, \'row-major\' )';
+ expected = 'ndarray( \'bool\', new BooleanArray( [ true, false, true, false ] ), [ 2, 2 ], [ 2, 1 ], 0, \'row-major\' )';
actual = arr.toString();
t.strictEqual( actual, expected, 'returns expected value' );
@@ -3655,6 +3655,348 @@ tape( 'an ndarray has a custom `toString()` method (large array; complex type)',
t.end();
});
+tape( 'an ndarray has a custom `toLocaleString()` method (row-major)', function test( t ) {
+ var expected;
+ var strides;
+ var actual;
+ var buffer;
+ var offset;
+ var dtype;
+ var order;
+ var shape;
+ var arr;
+
+ dtype = 'generic';
+ buffer = [ 1.0, 2.0, 3.0, 4.0, 5.0, 6.0, 7.0, 8.0 ];
+ shape = [ 2, 2 ];
+ order = 'row-major';
+ strides = [ 2, 1 ];
+ offset = 2;
+
+ arr = ndarray( dtype, buffer, shape, strides, offset, order );
+
+ t.strictEqual( hasOwnProp( arr, 'toLocaleString' ), false, 'does not have own property' );
+ t.strictEqual( hasProp( arr, 'toLocaleString' ), true, 'has property' );
+ t.strictEqual( isFunction( arr.toLocaleString ), true, 'has method' );
+
+ expected = 'ndarray( \'generic\', [ 3, 4, 5, 6 ], [ 2, 2 ], [ 2, 1 ], 0, \'row-major\' )';
+ actual = arr.toLocaleString();
+ t.strictEqual( actual, expected, 'returns expected value' );
+
+ t.end();
+});
+
+tape( 'an ndarray has a custom `toLocaleString()` method (column-major)', function test( t ) {
+ var expected;
+ var strides;
+ var actual;
+ var buffer;
+ var offset;
+ var dtype;
+ var order;
+ var shape;
+ var arr;
+
+ dtype = 'generic';
+ buffer = [ 1.0, 2.0, 3.0, 4.0 ];
+ shape = [ 2, 2 ];
+ order = 'column-major';
+ strides = [ -1, -2 ];
+ offset = 3;
+
+ arr = ndarray( dtype, buffer, shape, strides, offset, order );
+
+ t.strictEqual( hasOwnProp( arr, 'toLocaleString' ), false, 'does not have own property' );
+ t.strictEqual( hasProp( arr, 'toLocaleString' ), true, 'has property' );
+ t.strictEqual( isFunction( arr.toLocaleString ), true, 'has method' );
+
+ expected = 'ndarray( \'generic\', [ 4, 3, 2, 1 ], [ 2, 2 ], [ 1, 2 ], 0, \'column-major\' )';
+ actual = arr.toLocaleString();
+ t.strictEqual( actual, expected, 'returns expected value' );
+
+ t.end();
+});
+
+tape( 'an ndarray has a custom `toLocaleString()` method (complex type)', function test( t ) {
+ var expected;
+ var strides;
+ var actual;
+ var buffer;
+ var offset;
+ var dtype;
+ var order;
+ var shape;
+ var arr;
+
+ dtype = 'complex64';
+ buffer = new Complex64Array( [ 1, 2, 3, 4, 5, 6, 7, 8 ] );
+ shape = [ 2, 2 ];
+ order = 'row-major';
+ strides = [ 2, 1 ];
+ offset = 0;
+
+ arr = ndarray( dtype, buffer, shape, strides, offset, order );
+
+ t.strictEqual( hasOwnProp( arr, 'toLocaleString' ), false, 'does not have own property' );
+ t.strictEqual( hasProp( arr, 'toLocaleString' ), true, 'has property' );
+ t.strictEqual( isFunction( arr.toLocaleString ), true, 'has method' );
+
+ expected = 'ndarray( \'complex64\', new Complex64Array( [ 1, 2, 3, 4, 5, 6, 7, 8 ] ), [ 2, 2 ], [ 2, 1 ], 0, \'row-major\' )';
+ actual = arr.toLocaleString();
+ t.strictEqual( actual, expected, 'returns expected value' );
+
+ t.end();
+});
+
+tape( 'an ndarray has a custom `toLocaleString()` method (complex type)', function test( t ) {
+ var expected;
+ var strides;
+ var actual;
+ var buffer;
+ var offset;
+ var dtype;
+ var order;
+ var shape;
+ var arr;
+
+ dtype = 'complex128';
+ buffer = new Complex128Array( [ 1, 2, 3, 4, 5, 6, 7, 8 ] );
+ shape = [ 2, 2 ];
+ order = 'row-major';
+ strides = [ 2, 1 ];
+ offset = 0;
+
+ arr = ndarray( dtype, buffer, shape, strides, offset, order );
+
+ t.strictEqual( hasOwnProp( arr, 'toLocaleString' ), false, 'does not have own property' );
+ t.strictEqual( hasProp( arr, 'toLocaleString' ), true, 'has property' );
+ t.strictEqual( isFunction( arr.toLocaleString ), true, 'has method' );
+
+ expected = 'ndarray( \'complex128\', new Complex128Array( [ 1, 2, 3, 4, 5, 6, 7, 8 ] ), [ 2, 2 ], [ 2, 1 ], 0, \'row-major\' )';
+ actual = arr.toLocaleString();
+ t.strictEqual( actual, expected, 'returns expected value' );
+
+ t.end();
+});
+
+tape( 'an ndarray has a custom `toLocaleString()` method (boolean type)', function test( t ) {
+ var expected;
+ var strides;
+ var actual;
+ var buffer;
+ var offset;
+ var dtype;
+ var order;
+ var shape;
+ var arr;
+
+ dtype = 'bool';
+ buffer = new BooleanArray( [ true, false, true, false ] );
+ shape = [ 2, 2 ];
+ order = 'row-major';
+ strides = [ 2, 1 ];
+ offset = 0;
+
+ arr = ndarray( dtype, buffer, shape, strides, offset, order );
+
+ t.strictEqual( hasOwnProp( arr, 'toLocaleString' ), false, 'does not have own property' );
+ t.strictEqual( hasProp( arr, 'toLocaleString' ), true, 'has property' );
+ t.strictEqual( isFunction( arr.toLocaleString ), true, 'has method' );
+
+ expected = 'ndarray( \'bool\', new BooleanArray( [ true, false, true, false ] ), [ 2, 2 ], [ 2, 1 ], 0, \'row-major\' )';
+ actual = arr.toLocaleString();
+ t.strictEqual( actual, expected, 'returns expected value' );
+
+ t.end();
+});
+
+tape( 'an ndarray has a custom `toLocaleString()` method (0d)', function test( t ) {
+ var expected;
+ var strides;
+ var actual;
+ var buffer;
+ var offset;
+ var dtype;
+ var order;
+ var shape;
+ var arr;
+
+ dtype = 'generic';
+ buffer = [ 4.0 ];
+ shape = [];
+ order = 'row-major';
+ strides = [ 0 ];
+ offset = 0;
+
+ arr = ndarray( dtype, buffer, shape, strides, offset, order );
+
+ t.strictEqual( hasOwnProp( arr, 'toLocaleString' ), false, 'does not have own property' );
+ t.strictEqual( hasProp( arr, 'toLocaleString' ), true, 'has property' );
+ t.strictEqual( isFunction( arr.toLocaleString ), true, 'has method' );
+
+ expected = 'ndarray( \'generic\', [ 4 ], [], [ 0 ], 0, \'row-major\' )';
+ actual = arr.toLocaleString();
+ t.strictEqual( actual, expected, 'returns expected value' );
+
+ t.end();
+});
+
+tape( 'an ndarray has a custom `toLocaleString()` method (large array)', function test( t ) {
+ var expected;
+ var strides;
+ var actual;
+ var buffer;
+ var offset;
+ var dtype;
+ var order;
+ var shape;
+ var arr;
+ var i;
+
+ dtype = 'generic';
+ buffer = [];
+ for ( i = 0; i < 10000; i++ ) {
+ if ( i < 3 ) {
+ buffer.push( i + 1 );
+ } else if ( i >= 9997 ) {
+ buffer.push( i - 9993 );
+ } else {
+ buffer.push( 0 );
+ }
+ }
+ shape = [ 10000 ];
+ order = 'row-major';
+ strides = [ 1 ];
+ offset = 0;
+
+ arr = ndarray( dtype, buffer, shape, strides, offset, order );
+
+ t.strictEqual( hasOwnProp( arr, 'toLocaleString' ), false, 'does not have own property' );
+ t.strictEqual( hasProp( arr, 'toLocaleString' ), true, 'has property' );
+ t.strictEqual( isFunction( arr.toLocaleString ), true, 'has method' );
+
+ expected = 'ndarray( \'generic\', [ 1, 2, 3, ..., 4, 5, 6 ], [ 10000 ], [ 1 ], 0, \'row-major\' )';
+ actual = arr.toLocaleString();
+ t.strictEqual( actual, expected, 'returns expected value' );
+
+ t.end();
+});
+
+tape( 'an ndarray has a custom `toLocaleString()` method (large array; complex type)', function test( t ) {
+ var expected;
+ var strides;
+ var actual;
+ var buffer;
+ var offset;
+ var dtype;
+ var order;
+ var shape;
+ var arr;
+ var i;
+
+ dtype = 'complex64';
+ buffer = new Complex64Array( 10000 );
+ for ( i = 0; i < 10000; i++ ) {
+ if ( i < 3 ) {
+ buffer.set( new Complex64( i + 1, i + 1 ), i );
+ } else if ( i >= 9997 ) {
+ buffer.set( new Complex64( i - 9993, i - 9993 ), i );
+ } else {
+ buffer.set( new Complex64( 0, 0 ), i );
+ }
+ }
+ shape = [ 10000 ];
+ order = 'row-major';
+ strides = [ 1 ];
+ offset = 0;
+
+ arr = ndarray( dtype, buffer, shape, strides, offset, order );
+
+ t.strictEqual( hasOwnProp( arr, 'toLocaleString' ), false, 'does not have own property' );
+ t.strictEqual( hasProp( arr, 'toLocaleString' ), true, 'has property' );
+ t.strictEqual( isFunction( arr.toLocaleString ), true, 'has method' );
+
+ expected = 'ndarray( \'complex64\', new Complex64Array( [ 1, 1, 2, 2, 3, 3, ..., 4, 4, 5, 5, 6, 6 ] ), [ 10000 ], [ 1 ], 0, \'row-major\' )';
+ actual = arr.toLocaleString();
+ t.strictEqual( actual, expected, 'returns expected value' );
+
+ t.end();
+});
+
+tape( 'an ndarray has a custom `toLocaleString()` method (large array; complex type)', function test( t ) {
+ var expected;
+ var strides;
+ var actual;
+ var buffer;
+ var offset;
+ var dtype;
+ var order;
+ var shape;
+ var arr;
+ var i;
+
+ dtype = 'complex128';
+ buffer = new Complex128Array( 10000 );
+ for ( i = 0; i < 10000; i++ ) {
+ if ( i < 3 ) {
+ buffer.set( new Complex128( i + 1, i + 1 ), i );
+ } else if ( i >= 9997 ) {
+ buffer.set( new Complex128( i - 9993, i - 9993 ), i );
+ } else {
+ buffer.set( new Complex128( 0, 0 ), i );
+ }
+ }
+ shape = [ 10000 ];
+ order = 'row-major';
+ strides = [ 1 ];
+ offset = 0;
+
+ arr = ndarray( dtype, buffer, shape, strides, offset, order );
+
+ t.strictEqual( hasOwnProp( arr, 'toLocaleString' ), false, 'does not have own property' );
+ t.strictEqual( hasProp( arr, 'toLocaleString' ), true, 'has property' );
+ t.strictEqual( isFunction( arr.toLocaleString ), true, 'has method' );
+
+ expected = 'ndarray( \'complex128\', new Complex128Array( [ 1, 1, 2, 2, 3, 3, ..., 4, 4, 5, 5, 6, 6 ] ), [ 10000 ], [ 1 ], 0, \'row-major\' )';
+ actual = arr.toLocaleString();
+ t.strictEqual( actual, expected, 'returns expected value' );
+
+ t.end();
+});
+
+tape( 'an ndarray has a custom `toLocaleString()` method (locale, options)', function test( t ) {
+ var expected;
+ var strides;
+ var actual;
+ var buffer;
+ var offset;
+ var dtype;
+ var order;
+ var shape;
+ var arr;
+
+ dtype = 'generic';
+ buffer = [ 1234.567, 9876.543 ];
+ shape = [ 2 ];
+ order = 'row-major';
+ strides = [ 1 ];
+ offset = 0;
+
+ arr = ndarray( dtype, buffer, shape, strides, offset, order );
+
+ expected = 'ndarray( \'generic\', [ 1,234.567, 9,876.543 ], [ 2 ], [ 1 ], 0, \'row-major\' )';
+ actual = arr.toLocaleString( 'en-US' );
+ t.strictEqual( actual, expected, 'returns expected value' );
+
+ expected = 'ndarray( \'generic\', [ 1,234.6, 9,876.5 ], [ 2 ], [ 1 ], 0, \'row-major\' )';
+ actual = arr.toLocaleString( 'en-US', {
+ 'maximumFractionDigits': 1
+ });
+ t.strictEqual( actual, expected, 'returns expected value' );
+
+ t.end();
+});
+
tape( 'an ndarray has a custom `toJSON()` method (row-major)', function test( t ) {
var expected;
var strides;