@beenotung/tslib
Version:
utils library in Typescript
332 lines • 8.96 kB
JavaScript
;
Object.defineProperty(exports, "__esModule", { value: true });
exports.another = exports.not_equals = exports.equals = exports.cast = exports.applyIf = exports._if = exports.chainObject = exports.tryWithDefault = exports.tryCall = exports.tryApply = exports.repeatI = exports.mapI = exports.forI = exports.toNumber = exports.isNumber = exports.notDefined = exports.isDefined = exports.genFunction = exports.copyToArray = exports.copyArray = exports.concatArgs = exports.argsToArray = exports.objValues = exports.objToArray = exports.objFilter = exports.objMap = exports.objForEach = exports.deepCall = exports.compareString = exports.caseFunctionLookup = exports.caseLookup = exports.bindFunction = exports.ifNullFAsync = exports.ifNullF = exports.ifNull = exports.first_non_null = exports.getPropWithDefault = exports.checkedGetProp = exports.hasProp = exports.deepGetProp = void 0;
const tslib_1 = require("tslib");
/**
* Created by beenotung on 12/26/16.
*/
const defer_1 = require("./async/defer");
function deepGetProp(name, o) {
if (o[name]) {
return o[name];
}
const xs = name.split('.');
if (xs.length === 1) {
const message = `key '${name}' not found in object`;
console.warn(message, { name, o });
throw new TypeError(message);
}
const topLevelName = xs.shift();
const nextLevelName = xs.join('.');
return deepGetProp(nextLevelName, o[topLevelName]);
}
exports.deepGetProp = deepGetProp;
function hasProp(k, o) {
if (typeof o[k] !== 'undefined') {
return true;
}
if (Array.isArray(o)) {
return o.indexOf(k) !== -1;
}
return Object.keys(o).filter(x => x === k).length !== 0;
}
exports.hasProp = hasProp;
function checkedGetProp(k, o) {
if (hasProp(k, o)) {
return o[k];
}
else {
throw new TypeError(`property '${k}' does not exist in the object.`);
}
}
exports.checkedGetProp = checkedGetProp;
function getPropWithDefault(v, k, o) {
if (hasProp(k, o)) {
return o[k];
}
else {
return v;
}
}
exports.getPropWithDefault = getPropWithDefault;
function first_non_null(...args) {
for (const arg of args) {
if (arg) {
return arg;
}
}
return null;
}
exports.first_non_null = first_non_null;
/* return b if a is null or undefined (or false) */
function ifNull(a, b) {
return a ? a : b;
}
exports.ifNull = ifNull;
function ifNullF(a, f) {
return a ? a : f();
}
exports.ifNullF = ifNullF;
/**
* @remark won't flatten a
* */
function ifNullFAsync(a, f) {
return tslib_1.__awaiter(this, void 0, void 0, function* () {
/* not using Promise.resolve(a) directly to avoid flattening a when a is a promise */
const defer = defer_1.createDefer();
if (a) {
defer.resolve(a);
}
else {
f().then(x => defer.resolve(x));
}
return defer.promise;
});
}
exports.ifNullFAsync = ifNullFAsync;
/* tslint:disable:ban-types */
function bindFunction(f) {
const res = f.bind(f);
res.prototype = f.prototype;
return res;
}
exports.bindFunction = bindFunction;
/* tslint:enable:ban-types */
function caseLookup(cases, target) {
const xss = cases.filter(xs => xs[0] === target);
if (xss.length === 1) {
return xss[0][1];
}
else {
throw new Error('expect only 1 match, number of match:' + xss.length);
}
}
exports.caseLookup = caseLookup;
function caseFunctionLookup(cases, target) {
return caseLookup(cases, target)();
}
exports.caseFunctionLookup = caseFunctionLookup;
/**
* @deprecated use compare() or compare_string() instead
* */
function compareString(a, b) {
if (a === b) {
return 0;
}
return a < b ? -1 : 1;
}
exports.compareString = compareString;
function deepCall(f) {
while (typeof f === 'function') {
f = f();
}
return f;
}
exports.deepCall = deepCall;
function objForEach(f) {
return o => Object.keys(o).forEach(x => f(o[x], x, o));
}
exports.objForEach = objForEach;
function objMap(f) {
return o => Object.keys(o).map(x => f(o[x], x, o));
}
exports.objMap = objMap;
function objFilter(f) {
return o => Object.keys(o)
.filter(x => f(o[x], x, o))
.map(x => o[x]);
}
exports.objFilter = objFilter;
function objToArray(o) {
const xs = Object.keys(o);
const res = new Array(xs.length);
xs.forEach((x, i) => (res[i] = [o[x], x]));
return res;
}
exports.objToArray = objToArray;
function objValues(o) {
return Object.keys(o).map(x => o[x]);
}
exports.objValues = objValues;
function argsToArray(args) {
const len = args.length;
const res = new Array(len);
for (let i = 0; i < len; i++) {
res[i] = args[i];
}
return res;
}
exports.argsToArray = argsToArray;
/**
* take all from as ++ take some from args
* */
function concatArgs(as, args, offsetArgs = 0, nArgs = args.length) {
const na = as.length;
const res = new Array(na + nArgs);
let offset = 0;
for (; offset < na; offset++) {
res[offset] = as[offset];
}
for (let i = 0; i < nArgs; i++) {
res[offset + offsetArgs + i] = args[i];
}
return res;
}
exports.concatArgs = concatArgs;
function copyArray(xs, offset = 0, count = xs.length) {
const res = new Array(count);
for (let i = 0; i < count; i++) {
res[i] = xs[offset + i];
}
return res;
}
exports.copyArray = copyArray;
function copyToArray(dest, destOffset = 0, src, srcOffset = 0, count = src.length) {
for (let i = 0; i < count; i++) {
dest[destOffset + i] = src[srcOffset + i];
}
return dest;
}
exports.copyToArray = copyToArray;
/* tslint:disable:ban-types */
const nFuncs = [];
function genFunction(n, f) {
if (n < 1) {
return function fun0() {
return f.apply(null, arguments);
};
}
if (!nFuncs[n]) {
let args = 'a0';
for (let i = 1; i < n; i++) {
args += ', a' + i;
}
const code = `nFuncs[${n}] = function(f){
return function fun${n}(${args}){
return f.apply(null, arguments);
};
}`;
/* tslint:disable:no-eval */
eval(code);
/* tslint:enable:no-eval */
}
return nFuncs[n](f);
}
exports.genFunction = genFunction;
/* tslint:enable:ban-types */
function isDefined(a) {
return a !== null && a !== void 0;
}
exports.isDefined = isDefined;
function notDefined(a) {
return !isDefined(a);
}
exports.notDefined = notDefined;
function isNumber(i) {
return Number.isFinite(+i) && i !== '';
}
exports.isNumber = isNumber;
/** @deprecated */
const toString = JSON.stringify.bind(JSON);
function toNumber(i) {
if (!isNumber(i)) {
throw new TypeError(`expect number string, but got \`${toString(i)}\` of type ${typeof i}`);
}
return +i;
}
exports.toNumber = toNumber;
/**
* @param f: consumer function
* @param end: ending (exclusive)
* @param start: offset (inclusive)
* */
function forI(f, end, start = 0) {
for (let i = start; i < end; i++) {
f(i);
}
}
exports.forI = forI;
function mapI(f, size) {
const res = new Array(size);
forI(i => (res[i] = f(i)), size, 0);
return res;
}
exports.mapI = mapI;
function repeatI(f, size) {
return mapI(f, size);
}
exports.repeatI = repeatI;
/** apply the function without throwing exception */
function tryApply(f, args) {
try {
return f(...args);
}
catch (e) {
console.error(e);
}
}
exports.tryApply = tryApply;
/** call the function without throwing exception */
function tryCall(f, ...args) {
try {
return f(...args);
}
catch (e) {
console.error(e);
}
}
exports.tryCall = tryCall;
function tryWithDefault(f, defaultValue, args = []) {
try {
return f(...args);
}
catch (e) {
return defaultValue;
}
}
exports.tryWithDefault = tryWithDefault;
function chainObject(a) {
const res = (f) => {
f(a);
return res;
};
return res;
}
exports.chainObject = chainObject;
/* tslint:enable:ban-types */
function _if(f) {
return b => {
if (b) {
f();
}
};
}
exports._if = _if;
function applyIf(a, f) {
if (a) {
return f(a);
}
}
exports.applyIf = applyIf;
var noop_1 = require("./noop");
/**@deprecated*/
Object.defineProperty(exports, "gen_noop", { enumerable: true, get: function () { return noop_1.gen_noop; } });
/**@deprecated*/
Object.defineProperty(exports, "noop", { enumerable: true, get: function () { return noop_1.noop; } });
function cast(o) {
return o;
}
exports.cast = cast;
function equals(a, b) {
return a === b;
}
exports.equals = equals;
function not_equals(a, b) {
return a !== b;
}
exports.not_equals = not_equals;
function another(a, b, compare) {
return compare === a ? b : compare === b ? a : compare;
}
exports.another = another;
//# sourceMappingURL=lang.js.map