@opra/common
Version:
Opra common package
74 lines (73 loc) • 2.25 kB
JavaScript
var _a, _b;
import { ResponsiveMap } from '../../helpers/index.js';
import { DATATYPE_METADATA } from '../constants.js';
import { DataType } from '../data-type/data-type.js';
const kMap = Symbol.for('kMap');
const kCtorMap = Symbol.for('kCtorMap');
/**
* @class DataTypeMap
*/
export class DataTypeMap {
constructor() {
this[_a] = new ResponsiveMap();
this[_b] = new WeakMap();
}
get size() {
return this[kMap].size;
}
forEach(callbackFn, thisArg) {
this[kMap].forEach(callbackFn, thisArg);
}
get(nameOrCtor) {
let name = typeof nameOrCtor === 'string'
? nameOrCtor
: this[kCtorMap].get(nameOrCtor);
if (!name && typeof nameOrCtor === 'function') {
const metadata = Reflect.getMetadata(DATATYPE_METADATA, nameOrCtor);
name = metadata?.name;
}
if (!name && typeof nameOrCtor === 'object') {
const metadata = nameOrCtor[DATATYPE_METADATA];
name = metadata?.name;
}
if (!name)
return;
const out = this[kMap].get(name);
if (!out)
return;
if (typeof nameOrCtor === 'function' && out.kind === 'ComplexType')
return out.ctor === nameOrCtor ? out : undefined;
return out;
}
set(name, dataType) {
this[kMap].set(name, dataType);
if (dataType.ctor)
this[kCtorMap].set(dataType.ctor, name);
else if (dataType.instance)
this[kCtorMap].set(dataType.instance, name);
}
has(nameOrCtor) {
if (nameOrCtor instanceof DataType)
return !!nameOrCtor.name && this[kMap].has(nameOrCtor.name);
const name = typeof nameOrCtor === 'string'
? nameOrCtor
: this[kCtorMap].get(nameOrCtor);
return name ? this[kMap].has(name) : false;
}
keys() {
return this[kMap].keys();
}
values() {
return this[kMap].values();
}
entries() {
return this[kMap].entries();
}
sort(compareFn) {
this[kMap].sort(compareFn);
return this;
}
[(_a = kMap, _b = kCtorMap, Symbol.iterator)]() {
return this[kMap][Symbol.iterator]();
}
}