# Promotion Rules
> Return the ndarray [data type][@stdlib/ndarray/dtypes] with the smallest size and closest "kind" to which ndarray [data types][@stdlib/ndarray/dtypes] can be **safely** cast.
## Usage
```javascript
var promotionRules = require( '@stdlib/ndarray/promotion-rules' );
```
#### promotionRules( \[dtype1, dtype2] )
If provided [data types][@stdlib/ndarray/dtypes], returns the ndarray [data type][@stdlib/ndarray/dtypes] with the smallest size and closest "kind" to which ndarray [data types][@stdlib/ndarray/dtypes] can be **safely** cast.
```javascript
var out = promotionRules( 'float32', 'uint32' );
// returns 'float64'
```
If a [data type][@stdlib/ndarray/dtypes] to which [data types][@stdlib/ndarray/dtypes] can be safely cast does **not** exist (or is not supported), the function returns `-1`.
```javascript
var out = promotionRules( 'binary', 'generic' );
// returns -1
```
If not provided [data types][@stdlib/ndarray/dtypes], the function returns a promotion table.
```javascript
var out = promotionRules();
// returns {...}
var f32 = out[ 'float32' ];
// returns {...}
var rule = f32[ 'uint32' ];
// returns 'float64'
```
If provided an unrecognized or unsupported `dtype`, the function returns `null`.
```javascript
var out = promotionRules( 'foo', 'generic' );
// returns null
```
## Examples
```javascript
var dtypes = require( '@stdlib/ndarray/dtypes' );
var promotionRules = require( '@stdlib/ndarray/promotion-rules' );
var DTYPES;
var dt1;
var dt2;
var dt;
var i;
var j;
// Get the list of supported ndarray data types:
DTYPES = dtypes();
// Print the promotion rule for each pair of ndarray data types...
for ( i = 0; i < DTYPES.length; i++ ) {
dt1 = DTYPES[ i ];
for ( j = 0; j < DTYPES.length; j++ ) {
dt2 = DTYPES[ j ];
dt = promotionRules( dt1, dt2 );
console.log( '(%s, %s) => %s', dt1, dt2, dt );
}
}
```
[@stdlib/ndarray/dtypes]: https://www.npmjs.com/package/@stdlib/ndarray/tree/main/dtypes