export function noop() { } // tslint:disable-line export function same(o: any) { return o } export function is(x: any, y: any) { if (x === y) { return x !== 0 || 1 / x === 1 / y } else { return x !== x && y !== y } } export function range(size: any = 50, start: any = 0, step: any = 1) { const arr = [] for (let i = 0; i < size; i += 1) { arr[i] = i + start } return arr } export function oneOf(actual: any, expected: any) { if (!Array.isArray(expected)) { return new Error( 'Invalid argument supplied to oneOfType: expected an instance of array', ) } if (expected.filter((value) => is(actual, value)).length === 0) { return false } return true } export function o2a(obj: { [key: string]: any }) { return Object.keys(obj).map((key) => ({ key, value: obj[key] })) } export function a2o(arr: any) { return arr.length === 0 || arr.length === 1 ? { [arr[0].key]: arr[0].value } : arr.reduce((a: any, b: any) => { return Object.assign(a, { [b.key]: b.value }) // tslint:disable-line }, {}) } export function isPromise(value: any) { if (value !== null && typeof value === 'object') { return value && typeof value.then === 'function' } return false } export function debounce() { // todo } export function throttle() { // todo }