# 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 ); } } ```