scontainers
Version:
A container/collection/iterator library for JavaScript, comfortable to use, performant and versatile.
76 lines (55 loc) • 1.97 kB
JavaScript
;
function _implSymbol(target, sym, value) {
Object.defineProperty(target, sym, {
value,
configurable: true
});
return target[sym];
}
function _getSymbol(targetSymName, ...traitSets) {
let symbol;
traitSets.forEach(traitSet => {
const sym = traitSet[targetSymName];
if (typeof sym === 'symbol') {
if (!!symbol && symbol !== sym) {
throw new Error(`Symbol ${targetSymName} offered by multiple trait sets.`);
}
symbol = sym;
}
});
if (!symbol) {
throw new Error(`No trait set is providing symbol ${targetSymName}.`);
}
return symbol;
}
function _testTraitSet(traitSet) {
if (!traitSet || typeof traitSet === 'boolean' || typeof traitSet === 'number' || typeof traitSet === 'string') {
throw new Error(`${traitSet} cannot be used as a trait set.`);
}
}
const {
assert,
traits
} = require('../utils.js');
_testTraitSet(traits.utils);
_testTraitSet(traits.scontainers);
_testTraitSet(traits.semantics);
const _implScontainer = _getSymbol("implScontainer", traits.utils, traits.scontainers, traits.semantics);
const _forEach = _getSymbol("forEach", traits.utils, traits.scontainers, traits.semantics);
const _addTraitFactories = _getSymbol("addTraitFactories", traits.utils, traits.scontainers, traits.semantics);
const _wrapScontainer = _getSymbol("wrapScontainer", traits.utils, traits.scontainers, traits.semantics);
Object[_implScontainer]({
from(collection) {
// TODO: this function should be specialized, just like the rest of what this lib does...
if (collection[_forEach]) {
const object = {};
collection[_forEach]((value, key) => void (object[key] = value));
return object;
}
assert.fail();
}
});
traits.scontainers[_addTraitFactories](Object.prototype, {
ownProperties: Object[_wrapScontainer](require('./object_own_properties')),
properties: Object[_wrapScontainer](require('./object_enumerable_properties'))
});