From 526e73d6dca07e17839823ae1818212bccbda5d9 Mon Sep 17 00:00:00 2001 From: Suhani Ahirwar Date: Thu, 19 Mar 2026 17:34:18 +0530 Subject: [PATCH] feat: add ndarray/base/scalar-dtype (issue #11002) --- .../ndarray/base/atleastnd/lib/main.js | 23 ++----------- .../base/scalar-dtype/examples/index.js | 12 +++++++ .../ndarray/base/scalar-dtype/lib/main.js | 33 +++++++++++++++++++ .../ndarray/base/scalar-dtype/package.json | 8 +++++ .../ndarray/base/scalar-dtype/test/test.js | 19 +++++++++++ 5 files changed, 75 insertions(+), 20 deletions(-) create mode 100644 lib/node_modules/@stdlib/ndarray/base/scalar-dtype/examples/index.js create mode 100644 lib/node_modules/@stdlib/ndarray/base/scalar-dtype/lib/main.js create mode 100644 lib/node_modules/@stdlib/ndarray/base/scalar-dtype/package.json create mode 100644 lib/node_modules/@stdlib/ndarray/base/scalar-dtype/test/test.js diff --git a/lib/node_modules/@stdlib/ndarray/base/atleastnd/lib/main.js b/lib/node_modules/@stdlib/ndarray/base/atleastnd/lib/main.js index e742eb6cbdfb..fd0787c7bdd1 100644 --- a/lib/node_modules/@stdlib/ndarray/base/atleastnd/lib/main.js +++ b/lib/node_modules/@stdlib/ndarray/base/atleastnd/lib/main.js @@ -21,10 +21,6 @@ // MODULES // var isndarrayLike = require( '@stdlib/assert/is-ndarray-like' ); -var isNumber = require( '@stdlib/assert/is-number' ).isPrimitive; -var isComplexLike = require( '@stdlib/assert/is-complex-like' ); -var isBoolean = require( '@stdlib/assert/is-boolean' ).isPrimitive; -var complexDataType = require( '@stdlib/complex/dtype' ); var broadcastScalar = require( '@stdlib/ndarray/base/broadcast-scalar' ); var dims = require( '@stdlib/ndarray/base/ndims' ); var defaults = require( '@stdlib/ndarray/defaults' ); @@ -36,13 +32,11 @@ var getOrder = require( '@stdlib/ndarray/base/order' ); var getDType = require( '@stdlib/ndarray/base/dtype' ); var getData = require( '@stdlib/ndarray/base/data-buffer' ); var ones = require( '@stdlib/array/base/ones' ); +var scalarDType = require( '@stdlib/ndarray/base/scalar-dtype' ); // VARIABLES // -var DEFAULT_REAL = defaults.get( 'dtypes.real_floating_point' ); -var DEFAULT_CMPLX = defaults.get( 'dtypes.complex_floating_point' ); -var DEFAULT_BOOL = defaults.get( 'dtypes.boolean' ); var ORDER = defaults.get( 'order' ); @@ -107,19 +101,8 @@ function atleastnd( ndims, arrays ) { out.push( new ndarray( getDType( v ), getData( v ), shape, strides, getOffset( v ), getOrder( v ) ) ); // eslint-disable-line max-len continue; } - // For scalar values, resolve a corresponding ndarray data type... - if ( isNumber( v ) ) { // TODO: consider abstracting this logic to an `ndarray/base/scalar-dtype` (???) package, as this logic is found elsewhere (e.g., `ndarray/from-scalar`) and it would be good to avoid duplication, especially as we add support for more ndarray data types - dt = DEFAULT_REAL; - } else if ( isBoolean( v ) ) { - dt = DEFAULT_BOOL; - } else if ( isComplexLike( v ) ) { - dt = complexDataType( v ); - if ( dt === null ) { - dt = DEFAULT_CMPLX; - } - } else { - dt = 'generic'; - } + + dt = scalarDType( v ); out.push( broadcastScalar( v, dt, ones( ndims ), ORDER ) ); } return out; diff --git a/lib/node_modules/@stdlib/ndarray/base/scalar-dtype/examples/index.js b/lib/node_modules/@stdlib/ndarray/base/scalar-dtype/examples/index.js new file mode 100644 index 000000000000..0fda663989fd --- /dev/null +++ b/lib/node_modules/@stdlib/ndarray/base/scalar-dtype/examples/index.js @@ -0,0 +1,12 @@ +'use strict'; + +var scalarDType = require( './../lib' ); + +console.log( scalarDType( 5 ) ); +// => float64 + +console.log( scalarDType( true ) ); +// => bool + +console.log( scalarDType( {} ) ); +// => generic \ No newline at end of file diff --git a/lib/node_modules/@stdlib/ndarray/base/scalar-dtype/lib/main.js b/lib/node_modules/@stdlib/ndarray/base/scalar-dtype/lib/main.js new file mode 100644 index 000000000000..e32a5033b760 --- /dev/null +++ b/lib/node_modules/@stdlib/ndarray/base/scalar-dtype/lib/main.js @@ -0,0 +1,33 @@ +'use strict'; + +// MODULES // + +var isNumber = require( '@stdlib/assert/is-number' ).isPrimitive; +var isBoolean = require( '@stdlib/assert/is-boolean' ).isPrimitive; +var isComplexLike = require( '@stdlib/assert/is-complex-like' ); +var complexDataType = require( '@stdlib/complex/dtype' ); +var defaults = require( '@stdlib/ndarray/defaults' ); + +// VARIABLES // + +var DEFAULT_REAL = defaults.get( 'dtypes.real_floating_point' ); +var DEFAULT_CMPLX = defaults.get( 'dtypes.complex_floating_point' ); +var DEFAULT_BOOL = defaults.get( 'dtypes.boolean' ); + +// MAIN // + +function scalarDType( v ) { + if ( isNumber( v ) ) { + return DEFAULT_REAL; + } + if ( isBoolean( v ) ) { + return DEFAULT_BOOL; + } + if ( isComplexLike( v ) ) { + var dt = complexDataType( v ); + return ( dt === null ) ? DEFAULT_CMPLX : dt; + } + return 'generic'; +} + +module.exports = scalarDType; \ No newline at end of file diff --git a/lib/node_modules/@stdlib/ndarray/base/scalar-dtype/package.json b/lib/node_modules/@stdlib/ndarray/base/scalar-dtype/package.json new file mode 100644 index 000000000000..f438fb0c405b --- /dev/null +++ b/lib/node_modules/@stdlib/ndarray/base/scalar-dtype/package.json @@ -0,0 +1,8 @@ +{ + "name": "@stdlib/ndarray/base/scalar-dtype", + "version": "0.0.0", + "main": "./lib", + "scripts": { + "test": "node ./test/test.js" + } +} \ No newline at end of file diff --git a/lib/node_modules/@stdlib/ndarray/base/scalar-dtype/test/test.js b/lib/node_modules/@stdlib/ndarray/base/scalar-dtype/test/test.js new file mode 100644 index 000000000000..49bd10d2e0cf --- /dev/null +++ b/lib/node_modules/@stdlib/ndarray/base/scalar-dtype/test/test.js @@ -0,0 +1,19 @@ +'use strict'; + +var tape = require( 'tape' ); +var scalarDType = require( './../lib' ); + +tape( 'returns dtype for number', function test( t ) { + t.strictEqual( scalarDType( 5 ), 'float64', 'returns float64' ); + t.end(); +}); + +tape( 'returns dtype for boolean', function test( t ) { + t.strictEqual( scalarDType( true ), 'bool', 'returns bool' ); + t.end(); +}); + +tape( 'returns generic for objects', function test( t ) { + t.strictEqual( scalarDType( {} ), 'generic', 'returns generic' ); + t.end(); +}); \ No newline at end of file