@stdlib/types
Version:
stdlib TypeScript type declarations.
735 lines (646 loc) • 17 kB
text/typescript
/*
* @license Apache-2.0
*
* Copyright (c) 2019 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.
*/
/// <reference types="@stdlib/types"/>
import * as array from '@stdlib/types/array';
import * as blas from '@stdlib/types/blas';
import * as complex from '@stdlib/types/complex';
import * as iter from '@stdlib/types/iter';
import * as ndarray from '@stdlib/types/ndarray';
import * as obj from '@stdlib/types/object';
import * as random from '@stdlib/types/random';
import * as slice from '@stdlib/types/slice';
/**
* Returns an iterator protocol-compliant object.
*
* @returns iterator protocol-compliant object
*/
function createIterator1(): iter.Iterator {
return {
'next': next1
};
}
/**
* Implements the iterator protocol `next` method.
*
* @returns iterator protocol-compliant object
*/
function next1(): iter.IteratorResult {
return {
'value': true,
'done': false
};
}
/**
* Returns an iterator protocol-compliant object.
*
* @returns iterator protocol-compliant object
*/
function createIterator2(): iter.Iterator {
return {
'next': next2
};
}
/**
* Implements the iterator protocol `next` method.
*
* @returns iterator protocol-compliant object
*/
function next2(): iter.IteratorResult {
return {
'done': true
};
}
/**
* Returns an iterable iterator protocol-compliant object.
*
* @returns iterable iterator protocol-compliant object
*/
function createIterableIterator(): iter.IterableIterator {
return {
'next': next3,
[ Symbol.iterator ]: factory
};
}
/**
* Implements the iterator protocol `next` method.
*
* @returns iterator protocol-compliant object
*/
function next3(): iter.IteratorResult {
return {
'done': true
};
}
/**
* Returns an iterable iterator protocol-compliant object.
*
* @returns iterable iterator protocol-compliant object
*/
function factory(): iter.IterableIterator {
return createIterableIterator();
}
/**
* Returns a boolean array-like object.
*
* @returns boolean array-like object
*/
function boolArray(): array.BooleanArrayLike {
const buf: array.TypedArray = new Uint8Array( 8 );
const obj: array.BooleanArrayLike = {
'byteLength': 8,
'byteOffset': 0,
'BYTES_PER_ELEMENT': 1,
'length': 8,
'get': ( i: number ): boolean => {
return Boolean( buf[ i ] );
},
'set': ( value: boolean, i?: number ) => {
i = ( i ) ? i : 0;
buf[ i ] = ( buf[ i ] ) ? 1 : 0;
}
};
return obj;
}
/**
* Returns a complex number array-like object.
*
* @returns complex number array-like object
*/
function cmplxArray(): array.ComplexArrayLike {
const buf: array.TypedArray = new Float64Array( 8 );
const obj: array.ComplexArrayLike = {
'byteLength': 64,
'byteOffset': 0,
'BYTES_PER_ELEMENT': 8,
'length': 8,
'get': ( i: number ): complex.ComplexLike => {
return {
're': i * 10,
'im': i * 10
};
},
'set': ( value: complex.ComplexLike, i?: number ) => {
i = ( i ) ? i : 0;
buf[ i ] = value.re;
buf[ i + 1 ] = value.im;
}
};
return obj;
}
/**
* Returns a 64-bit complex number array.
*
* @returns 64-bit complex number array
*/
function cmplx64Array(): array.Complex64Array {
const buf: array.TypedArray = new Float64Array( 8 );
const obj: array.Complex64Array = {
'byteLength': 64,
'byteOffset': 0,
'BYTES_PER_ELEMENT': 8,
'length': 8,
'get': ( i: number ): complex.Complex64 => {
return {
're': i * 10,
'im': i * 10,
'byteLength': 8,
'BYTES_PER_ELEMENT': 4
};
},
'set': ( value: complex.Complex64, i?: number ) => {
i = ( i ) ? i : 0;
buf[ i ] = value.re;
buf[ i + 1 ] = value.im;
}
};
return obj;
}
/**
* Returns a 128-bit complex number array.
*
* @returns 128-bit complex number array
*/
function cmplx128Array(): array.Complex128Array {
const buf: array.TypedArray = new Float64Array( 16 );
const obj: array.Complex128Array = {
'byteLength': 128,
'byteOffset': 0,
'BYTES_PER_ELEMENT': 16,
'length': 8,
'get': ( i: number ): complex.Complex128 => {
return {
're': i * 10,
'im': i * 10,
'byteLength': 16,
'BYTES_PER_ELEMENT': 8
};
},
'set': ( value: complex.Complex128, i?: number ) => {
i = ( i ) ? i : 0;
buf[ i ] = value.re;
buf[ i + 1 ] = value.im;
}
};
return obj;
}
// TESTS //
// The compiler should not throw an error when using array type aliases...
{
const v1: array.TypedArray = new Float64Array( 10 );
if ( v1[ 0 ] !== 0.0 ) {
throw new Error( 'something went wrong' );
}
const v2: array.IntegerTypedArray = new Int32Array( 10 );
if ( v2[ 0 ] !== 0 ) {
throw new Error( 'something went wrong' );
}
const v3: array.NumericArray = new Float64Array( 10 );
if ( v3[ 0 ] !== 0.0 ) {
throw new Error( 'something went wrong' );
}
const v4: array.ArrayLike<string> = 'beep';
if ( v4[ 0 ] !== 'b' ) {
throw new Error( 'something went wrong' );
}
const v5: array.ArrayLike<number> = [ 1, 2, 3 ];
if ( v5[ 0 ] !== 1 ) {
throw new Error( 'something went wrong' );
}
const v6: array.ArrayLike<number> = new Int8Array( 10 );
if ( v6[ 0 ] !== 1 ) {
throw new Error( 'something went wrong' );
}
const v7: array.ComplexArrayLike = cmplxArray();
if ( v7.byteOffset !== 0 ) {
throw new Error( 'something went wrong' );
}
const v8: array.Complex64Array = cmplx64Array();
if ( v8.byteOffset !== 0 ) {
throw new Error( 'something went wrong' );
}
const v9: array.Complex128Array = cmplx128Array();
if ( v9.byteOffset !== 0 ) {
throw new Error( 'something went wrong' );
}
const v10: array.ComplexTypedArray = cmplx64Array();
if ( v10.byteOffset !== 0 ) {
throw new Error( 'something went wrong' );
}
const v11: array.ArrayOrTypedArray = new Float64Array( 10 );
if ( v11[ 0 ] !== 0.0 ) {
throw new Error( 'something went wrong' );
}
const v12: array.FloatTypedArray = new Float64Array( 10 );
if ( v12[ 0 ] !== 0.0 ) {
throw new Error( 'something went wrong' );
}
const v13: array.RealOrComplexArray = new Float64Array( 10 );
if ( v13[ 0 ] !== 0.0 ) {
throw new Error( 'something went wrong' );
}
const v14: array.RealOrComplexTypedArray = new Float64Array( 10 );
if ( v14[ 0 ] !== 0.0 ) {
throw new Error( 'something went wrong' );
}
const v15buf: array.ArrayLike<number> = new Float64Array( 10 );
const v15: array.AccessorArrayLike<number> = {
'length': 10,
'data': v15buf,
'get': ( i: number ): number => v15buf[ i ],
'set': ( value: number, i?: number ): void => {
v15buf[ i || 0 ] = value;
return;
}
};
if ( v15.length !== 10 ) {
throw new Error( 'something went wrong' );
}
const v16: array.IntegerTypedArray = new Int32Array( 10 );
if ( v16[ 0 ] !== 0 ) {
throw new Error( 'something went wrong' );
}
const v17: array.SignedIntegerTypedArray = new Int32Array( 10 );
if ( v17[ 0 ] !== 0 ) {
throw new Error( 'something went wrong' );
}
const v18: array.UnsignedIntegerTypedArray = new Uint32Array( 10 );
if ( v18[ 0 ] !== 0 ) {
throw new Error( 'something went wrong' );
}
const v19: array.AnyArray = new Uint32Array( 10 );
if ( v19[ 0 ] !== 0 ) {
throw new Error( 'something went wrong' );
}
const v20: array.RealTypedArray = new Uint32Array( 10 );
if ( v20[ 0 ] !== 0 ) {
throw new Error( 'something went wrong' );
}
const v21: array.FloatOrComplexTypedArray = new Float64Array( 10 );
if ( v21[ 0 ] !== 0.0 ) {
throw new Error( 'something went wrong' );
}
const v22: array.Array1D<number> = [ 1, 2, 3 ];
if ( v22.length === 0 ) {
throw new Error( 'something went wrong' );
}
const v23: array.Array2D<number> = [ [ 1, 2, 3 ] ];
if ( v23.length === 0 ) {
throw new Error( 'something went wrong' );
}
const v24: array.Array3D<number> = [ [ [ 1, 2, 3 ] ] ];
if ( v24.length === 0 ) {
throw new Error( 'something went wrong' );
}
const v25: array.Array4D<number> = [ [ [ [ 1, 2, 3 ] ] ] ];
if ( v25.length === 0 ) {
throw new Error( 'something went wrong' );
}
const v26: array.Array5D<number> = [ [ [ [ [ 1, 2, 3 ] ] ] ] ];
if ( v26.length === 0 ) {
throw new Error( 'something went wrong' );
}
const v27: array.Array6D<number> = [ [ [ [ [ [ 1, 2, 3 ] ] ] ] ] ];
if ( v27.length === 0 ) {
throw new Error( 'something went wrong' );
}
const v28: array.Array7D<number> = [ [ [ [ [ [ [ 1, 2, 3 ] ] ] ] ] ] ];
if ( v28.length === 0 ) {
throw new Error( 'something went wrong' );
}
const v29: array.Array8D<number> = [ [ [ [ [ [ [ [ 1, 2, 3 ] ] ] ] ] ] ] ];
if ( v29.length === 0 ) {
throw new Error( 'something went wrong' );
}
const v30: array.Array9D<number> = [ [ [ [ [ [ [ [ [ 1, 2, 3 ] ] ] ] ] ] ] ] ];
if ( v30.length === 0 ) {
throw new Error( 'something went wrong' );
}
const v31: array.Array10D<number> = [ [ [ [ [ [ [ [ [ [ 1, 2, 3 ] ] ] ] ] ] ] ] ] ];
if ( v31.length === 0 ) {
throw new Error( 'something went wrong' );
}
const v32: array.Collection<number> = [ 1, 2, 3 ];
if ( v32.length !== 3 ) {
throw new Error( 'something went wrong' );
}
const v33: array.BooleanArrayLike = boolArray();
if ( v33.byteOffset !== 0 ) {
throw new Error( 'something went wrong' );
}
}
// The compiler should not throw an error when using BLAS types...
{
const v1: blas.Layout = 'row-major';
if ( typeof v1 !== 'string' ) {
throw new Error( 'something went wrong' );
}
const v2: blas.TransposeOperation = 'transpose';
if ( typeof v2 !== 'string' ) {
throw new Error( 'something went wrong' );
}
const v3: blas.MatrixTriangle = 'upper';
if ( typeof v3 !== 'string' ) {
throw new Error( 'something went wrong' );
}
const v4: blas.DiagonalType = 'unit';
if ( typeof v4 !== 'string' ) {
throw new Error( 'something went wrong' );
}
const v5: blas.OperationSide = 'right';
if ( typeof v5 !== 'string' ) {
throw new Error( 'something went wrong' );
}
}
// The compiler should not throw an error when using complex number types...
{
const v1: complex.ComplexLike = {
're': 1.0,
'im': 1.0
};
if ( v1.re !== 1.0 ) {
throw new Error( 'something went wrong' );
}
const v2: complex.Complex64 = {
're': 1.0,
'im': 1.0,
'byteLength': 8,
'BYTES_PER_ELEMENT': 4
};
if ( v2.re !== 1.0 ) {
throw new Error( 'something went wrong' );
}
const v3: complex.Complex128 = {
're': 1.0,
'im': 1.0,
'byteLength': 16,
'BYTES_PER_ELEMENT': 8
};
if ( v3.re !== 1.0 ) {
throw new Error( 'something went wrong' );
}
}
// The compiler should not throw an error when using iterator or iterable types...
{
createIterator1();
createIterator2();
createIterableIterator();
}
// The compiler should not throw an error when using ndarray types...
{
const data = [ 1, 2, 3 ];
const arr: ndarray.ndarray = {
'byteLength': null,
'BYTES_PER_ELEMENT': null,
'data': data,
'dtype': 'generic',
'flags': {
'ROW_MAJOR_CONTIGUOUS': true,
'COLUMN_MAJOR_CONTIGUOUS': false
},
'length': 3,
'ndims': 1,
'offset': 0,
'order': 'row-major',
'shape': [ 3 ],
'strides': [ 1 ],
'get': ( i: number ): number => {
return data[ i ];
},
'set': ( i: number, v: number ): ndarray.ndarray => {
data[ i ] = v;
return arr;
}
};
if ( arr.length !== 3 ) {
throw new Error( 'something went wrong' );
}
}
// The compiler should not throw an error when using object types...
{
const desc1: obj.DataPropertyDescriptor = {
'configurable': true,
'enumerable': false,
'writable': false,
'value': 'beep'
};
if ( desc1.value !== 'beep' ) {
throw new Error( 'something went wrong' );
}
const desc2: obj.DataPropertyDescriptor = {
'enumerable': false,
'writable': false,
'value': 'beep'
};
if ( desc2.value !== 'beep' ) {
throw new Error( 'something went wrong' );
}
const desc3: obj.DataPropertyDescriptor = {
'configurable': true,
'writable': false,
'value': 'beep'
};
if ( desc3.value !== 'beep' ) {
throw new Error( 'something went wrong' );
}
const desc4: obj.DataPropertyDescriptor = {
'configurable': true,
'enumerable': false,
'writable': false
};
if ( desc4.value ) {
throw new Error( 'something went wrong' );
}
const desc5: obj.DataPropertyDescriptor = {
'writable': false,
'value': 'beep'
};
if ( desc5.value !== 'beep' ) {
throw new Error( 'something went wrong' );
}
const desc6: obj.DataPropertyDescriptor = {
'configurable': true,
'value': 'beep'
};
if ( desc6.value !== 'beep' ) {
throw new Error( 'something went wrong' );
}
const desc7: obj.DataPropertyDescriptor = {
'enumerable': false,
'value': 'beep'
};
if ( desc7.value !== 'beep' ) {
throw new Error( 'something went wrong' );
}
const desc8: obj.DataPropertyDescriptor = {
'enumerable': false,
'writable': false
};
if ( desc8.value ) {
throw new Error( 'something went wrong' );
}
const desc9: obj.AccessorPropertyDescriptor = {
'configurable': true,
'enumerable': false,
'get': (): string => 'beep',
'set': () => { throw new Error( 'beep' ); }
};
if ( desc9.enumerable !== false ) {
throw new Error( 'something went wrong' );
}
const desc10: obj.AccessorPropertyDescriptor = {
'enumerable': false,
'get': (): string => 'beep',
'set': () => { throw new Error( 'beep' ); }
};
if ( desc10.enumerable !== false ) {
throw new Error( 'something went wrong' );
}
const desc11: obj.AccessorPropertyDescriptor = {
'configurable': true,
'get': (): string => 'beep',
'set': () => { throw new Error( 'beep' ); }
};
if ( desc11.enumerable !== false ) {
throw new Error( 'something went wrong' );
}
const desc12: obj.AccessorPropertyDescriptor = {
'configurable': true,
'enumerable': false,
'set': () => { throw new Error( 'beep' ); }
};
if ( desc12.enumerable !== false ) {
throw new Error( 'something went wrong' );
}
const desc13: obj.AccessorPropertyDescriptor = {
'configurable': true,
'enumerable': false,
'get': (): string => 'beep'
};
if ( desc13.enumerable !== false ) {
throw new Error( 'something went wrong' );
}
const desc14: obj.AccessorPropertyDescriptor = {
'get': (): string => 'beep',
'set': () => { throw new Error( 'beep' ); }
};
if ( desc14.enumerable !== false ) {
throw new Error( 'something went wrong' );
}
const desc15: obj.PropertyDescriptor = {
'configurable': true,
'enumerable': false,
'writable': false,
'value': 'beep'
};
if ( desc15.value !== 'beep' ) {
throw new Error( 'something went wrong' );
}
const prop: obj.PropertyName = 'foo';
if ( prop !== 'foo' ) {
throw new Error( 'something went wrong' );
}
}
// The compiler should not throw an error when using PRNG types...
{
const rand: random.PRNG = (): number => 3.14;
if ( rand() !== 3.14 ) {
throw new Error( 'something went wrong' );
}
const s1: random.PRNGSeedMT19937 = 12345;
if ( s1 !== 12345 ) {
throw new Error( 'something went wrong' );
}
const s2: random.PRNGSeedMT19937 = new Uint32Array( 10 );
if ( s2[ 0 ] !== 0 ) {
throw new Error( 'something went wrong' );
}
const s3: random.PRNGSeedMINSTD = 12345;
if ( s3 !== 12345 ) {
throw new Error( 'something went wrong' );
}
const s4: random.PRNGSeedMINSTD = new Int32Array( 10 );
if ( s4[ 0 ] !== 0 ) {
throw new Error( 'something went wrong' );
}
const s5: random.PRNGStateMT19937 = new Uint32Array( 10 );
if ( s5[ 0 ] !== 0 ) {
throw new Error( 'something went wrong' );
}
const s6: random.PRNGStateMINSTD = new Int32Array( 10 );
if ( s6[ 0 ] !== 0 ) {
throw new Error( 'something went wrong' );
}
}
// The compiler should not throw an error when using slice types...
{
const v1: slice.Slice = {
'start': 0,
'stop': 10,
'step': 1
};
if ( v1.start !== v1.start ) {
throw new Error( 'something went wrong' );
}
const v2: slice.Slice = {
'start': null,
'stop': null,
'step': null
};
if ( v2.start !== v2.start ) {
throw new Error( 'something went wrong' );
}
const v3: slice.Slice = {
'start': null,
'stop': 10,
'step': null
};
if ( v3.start !== v3.start ) {
throw new Error( 'something went wrong' );
}
const v4: slice.Slice = {
'start': 0,
'stop': 10,
'step': null
};
if ( v4.start !== v4.start ) {
throw new Error( 'something went wrong' );
}
const v5: slice.Slice = {
'start': 0,
'stop': null,
'step': null
};
if ( v5.start !== v5.start ) {
throw new Error( 'something went wrong' );
}
const v6: slice.Slice = {
'start': 0,
'stop': null,
'step': 1
};
if ( v6.start !== v6.start ) {
throw new Error( 'something went wrong' );
}
const v7: slice.MultiSlice = {
'ndims': 3,
'data': [ 1, null, 3 ]
};
if ( v7.ndims !== v7.ndims ) {
throw new Error( 'something went wrong' );
}
}