@opra/common
Version:
Opra common package
74 lines (73 loc) • 2.28 kB
JavaScript
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 {
[kMap] = new ResponsiveMap();
[kCtorMap] = 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' &&
out.ctor !== nameOrCtor) {
throw new TypeError(`An other data type with same class (${nameOrCtor.name}) already exists.`);
}
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;
}
[Symbol.iterator]() {
return this[kMap][Symbol.iterator]();
}
}