@rustable/type
Version:
A TypeScript implementation of Rust-like type system with generic support and runtime type information.
56 lines (52 loc) • 1.79 kB
JavaScript
;
var type = require('./type.js');
;
const factoryCache = /* @__PURE__ */ new WeakMap();
function createFactory(BaseClass, factoryFn) {
BaseClass = type.Type(BaseClass);
const cache = factoryCache.get(BaseClass) || /* @__PURE__ */ new WeakMap();
factoryCache.set(BaseClass, cache);
const key = factoryFn ?? BaseClass;
if (cache.has(key)) {
return cache.get(key);
}
function Factory(...args) {
if (!(this instanceof Factory)) {
return factoryFn ? factoryFn(...args) : new BaseClass(...args);
}
return Reflect.construct(BaseClass, args, this.constructor);
}
Factory.prototype = BaseClass.prototype;
const staticProps = Object.getOwnPropertyDescriptors(BaseClass);
Object.defineProperties(Factory, staticProps);
Object.setPrototypeOf(Factory, BaseClass);
cache.set(key, Factory);
return Factory;
}
function createFactoryProxy(BaseClass, factoryFn) {
BaseClass = type.Type(BaseClass);
const cache = factoryCache.get(BaseClass) || /* @__PURE__ */ new WeakMap();
factoryCache.set(BaseClass, cache);
const key = factoryFn ?? BaseClass;
if (cache.has(key)) {
return cache.get(key);
}
const Factory = new Proxy(BaseClass, {
construct(target, args, newTarget) {
return Reflect.construct(target, args, newTarget);
},
apply(target, thisArg, args) {
return factoryFn ? factoryFn.bind(thisArg)(...args) : Reflect.construct(target, args, target);
}
});
cache.set(key, Factory);
return Factory;
}
const createGenericType = (baseType) => {
return createFactory(baseType, (...generics) => {
return type.Type(baseType, generics);
});
};
exports.createFactory = createFactory;
exports.createFactoryProxy = createFactoryProxy;
exports.createGenericType = createGenericType;