248 lines
5.3 KiB
JavaScript
248 lines
5.3 KiB
JavaScript
export {proxy} from 'rtts_assert/rtts_assert';
|
|
|
|
var _global = typeof window === 'undefined' ? global : window;
|
|
export {_global as global};
|
|
|
|
export var Type = Function;
|
|
export var Math = _global.Math;
|
|
|
|
var assertionsEnabled_ = typeof assert !== 'undefined';
|
|
|
|
var int;
|
|
// global assert support, as Dart has it...
|
|
// TODO: `assert` calls need to be removed in production code!
|
|
if (assertionsEnabled_) {
|
|
_global.assert = assert;
|
|
// `int` is not a valid JS type
|
|
int = assert.define('int', function(value) {
|
|
return typeof value === 'number' && value%1 === 0;
|
|
});
|
|
} else {
|
|
int = {};
|
|
_global.assert = function() {};
|
|
}
|
|
export {int};
|
|
|
|
export class FIELD {
|
|
constructor(definition) {
|
|
this.definition = definition;
|
|
}
|
|
}
|
|
|
|
export class CONST {}
|
|
export class ABSTRACT {}
|
|
export class IMPLEMENTS {}
|
|
|
|
export function isPresent(obj):boolean {
|
|
return obj !== undefined && obj !== null;
|
|
}
|
|
|
|
export function isBlank(obj):boolean {
|
|
return obj === undefined || obj === null;
|
|
}
|
|
|
|
export function isString(obj):boolean {
|
|
return typeof obj === "string";
|
|
}
|
|
|
|
export function stringify(token):string {
|
|
if (typeof token === 'string') {
|
|
return token;
|
|
}
|
|
|
|
if (token === undefined || token === null) {
|
|
return '' + token;
|
|
}
|
|
|
|
if (token.name) {
|
|
return token.name;
|
|
}
|
|
|
|
return token.toString();
|
|
}
|
|
|
|
export class StringWrapper {
|
|
static fromCharCode(code:int):string {
|
|
return String.fromCharCode(code);
|
|
}
|
|
|
|
static charCodeAt(s:string, index:int) {
|
|
return s.charCodeAt(index);
|
|
}
|
|
|
|
static split(s:string, regExp:RegExp) {
|
|
return s.split(regExp.multiple);
|
|
}
|
|
|
|
static equals(s:string, s2:string):boolean {
|
|
return s === s2;
|
|
}
|
|
|
|
static replaceAll(s:string, from:RegExp, replace:string):string {
|
|
return s.replace(from.multiple, replace);
|
|
}
|
|
|
|
static startsWith(s:string, start:string) {
|
|
return s.startsWith(start);
|
|
}
|
|
|
|
static substring(s:string, start:int, end:int = null) {
|
|
return s.substring(start, end === null ? undefined: end);
|
|
}
|
|
|
|
static replaceAllMapped(s:string, from:RegExp, cb:Function): string {
|
|
return s.replace(from.multiple, function(...matches) {
|
|
return cb(matches);
|
|
});
|
|
}
|
|
|
|
static contains(s:string, substr:string): boolean {
|
|
return s.indexOf(substr) != -1;
|
|
}
|
|
}
|
|
|
|
export class StringJoiner {
|
|
constructor() {
|
|
this.parts = [];
|
|
}
|
|
|
|
add(part:string) {
|
|
this.parts.push(part);
|
|
}
|
|
|
|
toString():string {
|
|
return this.parts.join("");
|
|
}
|
|
}
|
|
|
|
export class NumberParseError extends Error {
|
|
constructor(message) {
|
|
super();
|
|
this.message = message;
|
|
}
|
|
|
|
toString() {
|
|
return this.message;
|
|
}
|
|
}
|
|
|
|
|
|
export class NumberWrapper {
|
|
static parseIntAutoRadix(text:string):int {
|
|
var result:int = parseInt(text);
|
|
if (isNaN(result)) {
|
|
throw new NumberParseError("Invalid integer literal when parsing " + text);
|
|
}
|
|
return result;
|
|
}
|
|
|
|
static parseInt(text:string, radix:int):int {
|
|
if (radix == 10) {
|
|
if (/^(\-|\+)?[0-9]+$/.test(text)) {
|
|
return parseInt(text, radix);
|
|
}
|
|
} else if (radix == 16) {
|
|
if (/^(\-|\+)?[0-9ABCDEFabcdef]+$/.test(text)) {
|
|
return parseInt(text, radix);
|
|
}
|
|
} else {
|
|
var result:int = parseInt(text, radix);
|
|
if (!isNaN(result)) {
|
|
return result;
|
|
}
|
|
}
|
|
throw new NumberParseError("Invalid integer literal when parsing " + text + " in base " + radix);
|
|
}
|
|
|
|
// TODO: NaN is a valid literal but is returned by parseFloat to indicate an error.
|
|
static parseFloat(text:string):number {
|
|
return parseFloat(text);
|
|
}
|
|
|
|
static get NaN():number {
|
|
return NaN;
|
|
}
|
|
|
|
static isNaN(value):boolean {
|
|
return isNaN(value);
|
|
}
|
|
|
|
static isInteger(value):boolean {
|
|
return Number.isInteger(value);
|
|
}
|
|
}
|
|
|
|
var RegExp;
|
|
if (assertionsEnabled_) {
|
|
RegExp = assert.define('RegExp', function(obj) {
|
|
assert(obj).is(assert.structure({
|
|
single: _global.RegExp,
|
|
multiple: _global.RegExp
|
|
}));
|
|
});
|
|
} else {
|
|
RegExp = {};
|
|
}
|
|
|
|
export class RegExpWrapper {
|
|
static create(regExpStr, flags:string = ''):RegExp {
|
|
flags = flags.replace(/g/g, '');
|
|
return {
|
|
multiple: new _global.RegExp(regExpStr, flags + 'g'),
|
|
single: new _global.RegExp(regExpStr, flags)
|
|
};
|
|
}
|
|
static firstMatch(regExp, input) {
|
|
return input.match(regExp.single);
|
|
}
|
|
static matcher(regExp, input) {
|
|
return {
|
|
re: regExp.multiple,
|
|
input: input
|
|
};
|
|
}
|
|
}
|
|
|
|
export class RegExpMatcherWrapper {
|
|
static next(matcher) {
|
|
return matcher.re.exec(matcher.input);
|
|
}
|
|
}
|
|
|
|
export class FunctionWrapper {
|
|
static apply(fn:Function, posArgs) {
|
|
return fn.apply(null, posArgs);
|
|
}
|
|
}
|
|
|
|
// No subclass so that we preserve error stack.
|
|
export var BaseException = Error;
|
|
|
|
// JS has NaN !== NaN
|
|
export function looseIdentical(a, b):boolean {
|
|
return a === b ||
|
|
typeof a === "number" && typeof b === "number" && isNaN(a) && isNaN(b);
|
|
}
|
|
|
|
// JS considers NaN is the same as NaN for map Key (while NaN !== NaN otherwise)
|
|
// see https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Map
|
|
export function getMapKey(value) {
|
|
return value;
|
|
}
|
|
|
|
export function normalizeBlank(obj) {
|
|
return isBlank(obj) ? null : obj;
|
|
}
|
|
|
|
export function isJsObject(o):boolean {
|
|
return o !== null && (typeof o === "function" || typeof o === "object");
|
|
}
|
|
|
|
export function assertionsEnabled():boolean {
|
|
return assertionsEnabled_;
|
|
}
|
|
|
|
export function print(obj) {
|
|
console.log(obj);
|
|
}
|