UNPKG

scontainers

Version:

A container/collection/iterator library for JavaScript, comfortable to use, performant and versatile.

76 lines (55 loc) 1.97 kB
"use strict"; 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')) });