-
Notifications
You must be signed in to change notification settings - Fork 0
/
index.mjs.map
7 lines (7 loc) · 70.3 KB
/
index.mjs.map
1
2
3
4
5
6
7
{
"version": 3,
"sources": ["../src/Constants.js", "../src/Storage.js", "../src/Util.js", "../src/Serialize.js", "../src/Entity.js", "../src/Query.js", "../src/Component.js", "../src/World.js", "../src/System.js", "../src/index.js"],
"sourcesContent": ["export const TYPES_ENUM = {\n i8: 'i8',\n ui8: 'ui8',\n ui8c: 'ui8c',\n i16: 'i16',\n ui16: 'ui16',\n i32: 'i32',\n ui32: 'ui32',\n f32: 'f32',\n f64: 'f64',\n eid: 'eid',\n}\n\nexport const TYPES_NAMES = {\n i8: 'Int8',\n ui8: 'Uint8',\n ui8c: 'Uint8Clamped',\n i16: 'Int16',\n ui16: 'Uint16',\n i32: 'Int32',\n ui32: 'Uint32',\n eid: 'Uint32',\n f32: 'Float32',\n f64: 'Float64'\n}\n\nexport const TYPES = {\n i8: Int8Array,\n ui8: Uint8Array,\n ui8c: Uint8ClampedArray,\n i16: Int16Array,\n ui16: Uint16Array,\n i32: Int32Array,\n ui32: Uint32Array,\n f32: Float32Array,\n f64: Float64Array,\n eid: Uint32Array,\n}\n\nexport const UNSIGNED_MAX = {\n uint8: 2**8,\n uint16: 2**16,\n uint32: 2**32\n}\n", "import { TYPES, TYPES_ENUM, TYPES_NAMES, UNSIGNED_MAX } from './Constants.js'\n// import { createAllocator } from './Allocator.js'\n\nconst roundToMultiple = mul => x => Math.ceil(x / mul) * mul\nconst roundToMultiple4 = roundToMultiple(4)\n\nexport const $storeRef = Symbol('storeRef')\nexport const $storeSize = Symbol('storeSize')\nexport const $storeMaps = Symbol('storeMaps')\nexport const $storeFlattened = Symbol('storeFlattened')\nexport const $storeBase = Symbol('storeBase')\nexport const $storeType = Symbol('storeType')\n\nexport const $storeArrayElementCounts = Symbol('storeArrayElementCounts')\nexport const $storeSubarrays = Symbol('storeSubarrays')\nexport const $subarrayCursors = Symbol('subarrayCursors')\nexport const $subarray = Symbol('subarray')\nexport const $subarrayFrom = Symbol('subarrayFrom')\nexport const $subarrayTo = Symbol('subarrayTo')\nexport const $parentArray = Symbol('parentArray')\nexport const $tagStore = Symbol('tagStore')\n\nexport const $queryShadow = Symbol('queryShadow')\nexport const $serializeShadow = Symbol('serializeShadow')\n\nexport const $indexType = Symbol('indexType')\nexport const $indexBytes = Symbol('indexBytes')\n\nexport const $isEidType = Symbol('isEidType')\n\nconst stores = {}\n\n// const alloc = createAllocator()\n\nexport const resize = (ta, size) => {\n const newBuffer = new ArrayBuffer(size * ta.BYTES_PER_ELEMENT)\n const newTa = new ta.constructor(newBuffer)\n newTa.set(ta, 0)\n return newTa\n}\n\nexport const createShadow = (store, key) => {\n if (!ArrayBuffer.isView(store)) {\n const shadowStore = store[$parentArray].slice(0)\n store[key] = store.map((_,eid) => {\n const { length } = store[eid]\n const start = length * eid\n const end = start + length\n return shadowStore.subarray(start, end)\n })\n } else {\n store[key] = store.slice(0)\n }\n}\n\nconst resizeSubarray = (metadata, store, storeSize) => {\n const cursors = metadata[$subarrayCursors]\n let type = store[$storeType]\n const length = store[0].length\n const indexType =\n length <= UNSIGNED_MAX.uint8\n ? TYPES_ENUM.ui8\n : length <= UNSIGNED_MAX.uint16\n ? TYPES_ENUM.ui16\n : TYPES_ENUM.ui32\n\n if (cursors[type] === 0) {\n\n const arrayElementCount = metadata[$storeArrayElementCounts][type]\n \n // // for threaded impl\n // // const summedBytesPerElement = Array(arrayCount).fill(0).reduce((a, p) => a + TYPES[type].BYTES_PER_ELEMENT, 0)\n // // const totalBytes = roundToMultiple4(summedBytesPerElement * summedLength * size)\n // // const buffer = new SharedArrayBuffer(totalBytes)\n\n const array = new TYPES[type](roundToMultiple4(arrayElementCount * storeSize))\n\n array.set(metadata[$storeSubarrays][type])\n \n metadata[$storeSubarrays][type] = array\n \n array[$indexType] = TYPES_NAMES[indexType]\n array[$indexBytes] = TYPES[indexType].BYTES_PER_ELEMENT\n }\n\n const start = cursors[type]\n const end = start + (storeSize * length)\n cursors[type] = end\n\n store[$parentArray] = metadata[$storeSubarrays][type].subarray(start, end)\n\n // pre-generate subarrays for each eid\n for (let eid = 0; eid < storeSize; eid++) {\n const start = length * eid\n const end = start + length\n store[eid] = store[$parentArray].subarray(start, end)\n store[eid][$indexType] = TYPES_NAMES[indexType]\n store[eid][$indexBytes] = TYPES[indexType].BYTES_PER_ELEMENT\n store[eid][$subarray] = true\n }\n\n}\n\nconst resizeRecursive = (metadata, store, size) => {\n Object.keys(store).forEach(key => {\n const ta = store[key]\n if (Array.isArray(ta)) {\n resizeSubarray(metadata, ta, size)\n store[$storeFlattened].push(ta)\n } else if (ArrayBuffer.isView(ta)) {\n store[key] = resize(ta, size)\n store[$storeFlattened].push(store[key])\n } else if (typeof ta === 'object') {\n resizeRecursive(metadata, store[key], size)\n }\n })\n}\n\nexport const resizeStore = (store, size) => {\n if (store[$tagStore]) return\n store[$storeSize] = size\n store[$storeFlattened].length = 0\n Object.keys(store[$subarrayCursors]).forEach(k => {\n store[$subarrayCursors][k] = 0\n })\n resizeRecursive(store, store, size)\n}\n\nexport const resetStore = store => {\n if (store[$storeFlattened]) {\n store[$storeFlattened].forEach(ta => {\n ta.fill(0)\n })\n Object.keys(store[$storeSubarrays]).forEach(key => {\n store[$storeSubarrays][key].fill(0)\n })\n }\n}\n\nexport const resetStoreFor = (store, eid) => {\n if (store[$storeFlattened]) {\n store[$storeFlattened].forEach(ta => {\n if (ArrayBuffer.isView(ta)) ta[eid] = 0\n else ta[eid].fill(0)\n })\n }\n}\n\nconst createTypeStore = (type, length) => {\n const totalBytes = length * TYPES[type].BYTES_PER_ELEMENT\n const buffer = new ArrayBuffer(totalBytes)\n const store = new TYPES[type](buffer)\n store[$isEidType] = type === TYPES_ENUM.eid\n return store\n}\n\nexport const parentArray = store => store[$parentArray]\n\nconst createArrayStore = (metadata, type, length) => {\n const storeSize = metadata[$storeSize]\n const store = Array(storeSize).fill(0)\n store[$storeType] = type\n store[$isEidType] = type === TYPES_ENUM.eid\n\n const cursors = metadata[$subarrayCursors]\n const indexType =\n length <= UNSIGNED_MAX.uint8\n ? TYPES_ENUM.ui8\n : length <= UNSIGNED_MAX.uint16\n ? TYPES_ENUM.ui16\n : TYPES_ENUM.ui32\n\n if (!length) throw new Error('bitECS - Must define component array length')\n if (!TYPES[type]) throw new Error(`bitECS - Invalid component array property type ${type}`)\n\n // create buffer for type if it does not already exist\n if (!metadata[$storeSubarrays][type]) {\n const arrayElementCount = metadata[$storeArrayElementCounts][type]\n\n // for threaded impl\n // const summedBytesPerElement = Array(arrayCount).fill(0).reduce((a, p) => a + TYPES[type].BYTES_PER_ELEMENT, 0)\n // const totalBytes = roundToMultiple4(summedBytesPerElement * summedLength * size)\n // const buffer = new SharedArrayBuffer(totalBytes)\n\n const array = new TYPES[type](roundToMultiple4(arrayElementCount * storeSize))\n array[$indexType] = TYPES_NAMES[indexType]\n array[$indexBytes] = TYPES[indexType].BYTES_PER_ELEMENT\n\n metadata[$storeSubarrays][type] = array\n \n }\n\n const start = cursors[type]\n const end = start + (storeSize * length)\n cursors[type] = end\n\n store[$parentArray] = metadata[$storeSubarrays][type].subarray(start, end)\n\n // pre-generate subarrays for each eid\n for (let eid = 0; eid < storeSize; eid++) {\n const start = length * eid\n const end = start + length\n store[eid] = store[$parentArray].subarray(start, end)\n store[eid][$indexType] = TYPES_NAMES[indexType]\n store[eid][$indexBytes] = TYPES[indexType].BYTES_PER_ELEMENT\n store[eid][$subarray] = true\n }\n\n return store\n}\n\nconst isArrayType = x => Array.isArray(x) && typeof x[0] === 'string' && typeof x[1] === 'number'\n\nexport const createStore = (schema, size) => {\n const $store = Symbol('store')\n\n if (!schema || !Object.keys(schema).length) {\n // tag component\n stores[$store] = {\n [$storeSize]: size,\n [$tagStore]: true,\n [$storeBase]: () => stores[$store]\n }\n return stores[$store]\n }\n\n schema = JSON.parse(JSON.stringify(schema))\n\n const arrayElementCounts = {}\n const collectArrayElementCounts = s => {\n const keys = Object.keys(s)\n for (const k of keys) {\n if (isArrayType(s[k])) {\n if (!arrayElementCounts[s[k][0]]) arrayElementCounts[s[k][0]] = 0\n arrayElementCounts[s[k][0]] += s[k][1]\n } else if (s[k] instanceof Object) {\n collectArrayElementCounts(s[k])\n }\n }\n }\n collectArrayElementCounts(schema)\n\n const metadata = {\n [$storeSize]: size,\n [$storeMaps]: {},\n [$storeSubarrays]: {},\n [$storeRef]: $store,\n [$subarrayCursors]: Object.keys(TYPES).reduce((a, type) => ({ ...a, [type]: 0 }), {}),\n [$storeFlattened]: [],\n [$storeArrayElementCounts]: arrayElementCounts\n }\n\n if (schema instanceof Object && Object.keys(schema).length) {\n\n const recursiveTransform = (a, k) => {\n\n if (typeof a[k] === 'string') {\n\n a[k] = createTypeStore(a[k], size)\n a[k][$storeBase] = () => stores[$store]\n metadata[$storeFlattened].push(a[k])\n\n } else if (isArrayType(a[k])) {\n \n const [type, length] = a[k]\n a[k] = createArrayStore(metadata, type, length)\n a[k][$storeBase] = () => stores[$store]\n metadata[$storeFlattened].push(a[k])\n // Object.seal(a[k])\n\n } else if (a[k] instanceof Object) {\n \n a[k] = Object.keys(a[k]).reduce(recursiveTransform, a[k])\n // Object.seal(a[k])\n \n }\n\n return a\n }\n\n stores[$store] = Object.assign(Object.keys(schema).reduce(recursiveTransform, schema), metadata)\n stores[$store][$storeBase] = () => stores[$store]\n\n // Object.seal(stores[$store])\n\n return stores[$store]\n\n }\n}\n\nexport const free = (store) => {\n delete stores[store[$storeRef]]\n}", "export const Uint32SparseSet = (length) => {\n const dense = new Uint32Array(length)\n const sparse = new Uint32Array(length)\n\n let cursor = 0\n dense.count = () => cursor + 1\n\n const has = val => dense[sparse[val]] === val\n\n const add = val => {\n if (has(val)) return\n sparse[val] = cursor\n dense[cursor] = val\n\n cursor++\n }\n\n const remove = val => {\n if (!has(val)) return\n const index = sparse[val]\n const swapped = dense[cursor]\n if (swapped !== val) {\n dense[index] = swapped\n sparse[swapped] = index\n }\n\n cursor--\n }\n\n return {\n add,\n remove,\n has,\n sparse,\n dense,\n }\n}\n\nexport const SparseSet = () => {\n const dense = []\n const sparse = []\n\n dense.sort = function (comparator) {\n const result = Array.prototype.sort.call(this, comparator)\n\n for(let i = 0; i < dense.length; i++) {\n sparse[dense[i]] = i\n }\n \n return result\n }\n\n const has = val => dense[sparse[val]] === val\n\n const add = val => {\n if (has(val)) return\n sparse[val] = dense.push(val) - 1\n }\n\n const remove = val => {\n if (!has(val)) return\n const index = sparse[val]\n const swapped = dense.pop()\n if (swapped !== val) {\n dense[index] = swapped\n sparse[swapped] = index\n }\n }\n\n const reset = () => {\n dense.length = 0\n sparse.length = 0\n }\n\n return {\n add,\n remove,\n has,\n sparse,\n dense,\n reset,\n }\n}", "import { $indexBytes, $indexType, $isEidType, $serializeShadow, $storeBase, $storeFlattened, $tagStore, createShadow } from \"./Storage.js\"\nimport { $componentMap, addComponent, hasComponent } from \"./Component.js\"\nimport { $entityArray, $entitySparseSet, addEntity, eidToWorld } from \"./Entity.js\"\nimport { $localEntities, $localEntityLookup } from \"./World.js\"\nimport { SparseSet } from \"./Util.js\"\nimport { $modifier } from \"./Query.js\"\n\nexport const DESERIALIZE_MODE = {\n REPLACE: 0,\n APPEND: 1,\n MAP: 2\n}\n\nlet resized = false\n\nexport const setSerializationResized = v => { resized = v }\n\nconst concat = (a,v) => a.concat(v)\nconst not = fn => v => !fn(v)\n\nconst storeFlattened = c => c[$storeFlattened]\nconst isFullComponent = storeFlattened\nconst isProperty = not(isFullComponent)\n\nconst isModifier = c => typeof c === \"function\" && c[$modifier]\nconst isNotModifier = not(isModifier)\n\nconst isChangedModifier = c => isModifier(c) && c()[1] === 'changed'\n\nconst isWorld = w => Object.getOwnPropertySymbols(w).includes($componentMap)\n\nconst fromModifierToComponent = c => c()[0]\n\nexport const canonicalize = target => {\n\n if (isWorld(target)) return [[],new Map()]\n\n // aggregate full components\n const fullComponentProps = target\n .filter(isNotModifier)\n .filter(isFullComponent)\n .map(storeFlattened).reduce(concat, [])\n \n // aggregate changed full components\n const changedComponentProps = target\n .filter(isChangedModifier).map(fromModifierToComponent)\n .filter(isFullComponent)\n .map(storeFlattened).reduce(concat, [])\n\n // aggregate props\n const props = target\n .filter(isNotModifier)\n .filter(isProperty)\n\n // aggregate changed props\n const changedProps = target\n .filter(isChangedModifier).map(fromModifierToComponent)\n .filter(isProperty)\n \n const componentProps = [...fullComponentProps, ...props, ...changedComponentProps, ...changedProps]\n const allChangedProps = [...changedComponentProps, ...changedProps].reduce((map,prop) => {\n const $ = Symbol()\n createShadow(prop, $)\n map.set(prop, $)\n return map\n }, new Map())\n\n return [componentProps, allChangedProps]\n}\n\n/**\n * Defines a new serializer which targets the given components to serialize the data of when called on a world or array of EIDs.\n *\n * @param {object|array} target\n * @param {number} [maxBytes=20000000]\n * @returns {function} serializer\n */\nexport const defineSerializer = (target, maxBytes = 20000000) => {\n const worldSerializer = isWorld(target)\n\n let [componentProps, changedProps] = canonicalize(target)\n\n // TODO: calculate max bytes based on target & recalc upon resize\n\n const buffer = new ArrayBuffer(maxBytes)\n const view = new DataView(buffer)\n\n const entityComponentCache = new Map()\n\n return (ents) => {\n\n if (resized) {\n [componentProps, changedProps] = canonicalize(target)\n resized = false\n }\n\n if (worldSerializer) {\n componentProps = []\n target[$componentMap].forEach((c, component) => {\n if (component[$storeFlattened])\n componentProps.push(...component[$storeFlattened])\n else componentProps.push(component)\n })\n }\n \n let world\n if (Object.getOwnPropertySymbols(ents).includes($componentMap)) {\n world = ents\n ents = ents[$entityArray]\n } else {\n world = eidToWorld.get(ents[0])\n }\n\n let where = 0\n\n if (!ents.length) return buffer.slice(0, where)\n\n const cache = new Map()\n\n // iterate over component props\n for (let pid = 0; pid < componentProps.length; pid++) {\n const prop = componentProps[pid]\n const component = prop[$storeBase]()\n const $diff = changedProps.get(prop)\n const shadow = $diff ? prop[$diff] : null\n\n if (!cache.has(component)) cache.set(component, new Map())\n\n // write pid\n view.setUint8(where, pid)\n where += 1\n\n // save space for entity count\n const countWhere = where\n where += 4\n\n let writeCount = 0\n // write eid,val\n for (let i = 0; i < ents.length; i++) {\n const eid = ents[i]\n\n let componentCache = entityComponentCache.get(eid)\n if (!componentCache) componentCache = entityComponentCache.set(eid, new Set()).get(eid)\n \n componentCache.add(eid)\n \n const newlyAddedComponent = \n // if we are diffing\n shadow \n // and we have already iterated over this component for this entity\n // retrieve cached value \n && cache.get(component).get(eid)\n // or if entity did not have component last call\n || !componentCache.has(component)\n // and entity has component this call\n && hasComponent(world, component, eid)\n\n cache.get(component).set(eid, newlyAddedComponent)\n\n if (newlyAddedComponent) {\n componentCache.add(component)\n } else if (!hasComponent(world, component, eid)) {\n // skip if entity doesn't have this component\n componentCache.delete(component)\n continue\n } \n\n \n const rewindWhere = where\n\n // write eid\n view.setUint32(where, eid)\n where += 4\n\n // if it's a tag store we can stop here\n if (prop[$tagStore]) {\n writeCount++\n continue\n }\n\n // if property is an array\n if (ArrayBuffer.isView(prop[eid])) {\n const type = prop[eid].constructor.name.replace('Array', '')\n const indexType = prop[eid][$indexType]\n const indexBytes = prop[eid][$indexBytes]\n\n // save space for count of dirty array elements\n const countWhere2 = where\n where += indexBytes\n\n let arrayWriteCount = 0\n\n // write index,value\n for (let i = 0; i < prop[eid].length; i++) {\n\n if (shadow) {\n\n const changed = shadow[eid][i] !== prop[eid][i]\n \n // sync shadow\n shadow[eid][i] = prop[eid][i] \n\n // if state has not changed since the last call\n // todo: if newly added then entire component will serialize (instead of only changed values)\n if (!changed && !newlyAddedComponent) {\n // skip writing this value\n continue\n }\n }\n \n // write array index\n view[`set${indexType}`](where, i)\n where += indexBytes\n \n // write value at that index\n const value = prop[eid][i]\n view[`set${type}`](where, value)\n where += prop[eid].BYTES_PER_ELEMENT\n arrayWriteCount++\n }\n\n if (arrayWriteCount > 0) {\n // write total element count\n view[`set${indexType}`](countWhere2, arrayWriteCount)\n writeCount++\n } else {\n where = rewindWhere\n continue\n }\n } else {\n\n if (shadow) {\n\n const changed = shadow[eid] !== prop[eid]\n\n shadow[eid] = prop[eid]\n\n // do not write value if diffing and no change\n if (!changed && !newlyAddedComponent) {\n // rewind the serializer\n where = rewindWhere\n // skip writing this value\n continue\n }\n\n } \n\n\n const type = prop.constructor.name.replace('Array', '')\n // set value next [type] bytes\n view[`set${type}`](where, prop[eid])\n where += prop.BYTES_PER_ELEMENT\n\n writeCount++\n }\n }\n\n if (writeCount > 0) {\n // write how many eid/value pairs were written\n view.setUint32(countWhere, writeCount)\n } else {\n // if nothing was written (diffed with no changes) \n // then move cursor back 5 bytes (remove PID and countWhere space)\n where -= 5\n }\n }\n return buffer.slice(0, where)\n }\n}\n\nconst newEntities = new Map()\n\n/**\n * Defines a new deserializer which targets the given components to deserialize onto a given world.\n *\n * @param {object|array} target\n * @returns {function} deserializer\n */\nexport const defineDeserializer = (target) => {\n const isWorld = Object.getOwnPropertySymbols(target).includes($componentMap)\n let [componentProps] = canonicalize(target)\n\n const deserializedEntities = new Set()\n\n return (world, packet, mode=0) => {\n\n newEntities.clear()\n \n if (resized) {\n [componentProps] = canonicalize(target)\n resized = false\n }\n\n if (isWorld) {\n componentProps = []\n target[$componentMap].forEach((c, component) => {\n if (component[$storeFlattened])\n componentProps.push(...component[$storeFlattened])\n else componentProps.push(component)\n })\n }\n\n const localEntities = world[$localEntities]\n const localEntityLookup = world[$localEntityLookup]\n\n const view = new DataView(packet)\n let where = 0\n\n while (where < packet.byteLength) {\n\n // pid\n const pid = view.getUint8(where)\n where += 1\n\n // entity count\n const entityCount = view.getUint32(where)\n where += 4\n\n // component property\n const prop = componentProps[pid]\n\n // Get the entities and set their prop values\n for (let i = 0; i < entityCount; i++) {\n let eid = view.getUint32(where) // throws with [changed, c, changed]\n where += 4\n\n if (mode === DESERIALIZE_MODE.MAP) {\n if (localEntities.has(eid)) {\n eid = localEntities.get(eid)\n } else if (newEntities.has(eid)) {\n eid = newEntities.get(eid)\n } else {\n const newEid = addEntity(world)\n localEntities.set(eid, newEid)\n localEntityLookup.set(newEid, eid)\n newEntities.set(eid, newEid)\n eid = newEid\n }\n }\n\n if (mode === DESERIALIZE_MODE.APPEND || \n mode === DESERIALIZE_MODE.REPLACE && !world[$entitySparseSet].has(eid)\n ) {\n const newEid = newEntities.get(eid) || addEntity(world)\n newEntities.set(eid, newEid)\n eid = newEid\n }\n\n const component = prop[$storeBase]()\n if (!hasComponent(world, component, eid)) {\n addComponent(world, component, eid)\n }\n\n // add eid to deserialized ents after it has been transformed by MAP mode\n deserializedEntities.add(eid)\n\n if (component[$tagStore]) {\n continue\n }\n \n if (ArrayBuffer.isView(prop[eid])) {\n const array = prop[eid]\n const count = view[`get${array[$indexType]}`](where)\n where += array[$indexBytes]\n\n // iterate over count\n for (let i = 0; i < count; i++) {\n const index = view[`get${array[$indexType]}`](where)\n where += array[$indexBytes]\n\n const value = view[`get${array.constructor.name.replace('Array', '')}`](where)\n where += array.BYTES_PER_ELEMENT\n if (prop[$isEidType]) {\n let localEid\n if (localEntities.has(value)) {\n localEid = localEntities.get(value)\n } else if (newEntities.has(value)) {\n localEid = newEntities.get(value)\n } else {\n const newEid = addEntity(world)\n localEntities.set(value, newEid)\n localEntityLookup.set(newEid, value)\n newEntities.set(value, newEid)\n localEid = newEid\n }\n prop[eid][index] = localEid\n } else prop[eid][index] = value\n }\n } else {\n const value = view[`get${prop.constructor.name.replace('Array', '')}`](where)\n where += prop.BYTES_PER_ELEMENT\n\n if (prop[$isEidType]) {\n let localEid\n if (localEntities.has(value)) {\n localEid = localEntities.get(value)\n } else if (newEntities.has(value)) {\n localEid = newEntities.get(value)\n } else {\n const newEid = addEntity(world)\n localEntities.set(value, newEid)\n localEntityLookup.set(newEid, value)\n newEntities.set(value, newEid)\n localEid = newEid\n }\n prop[eid] = localEid\n } else prop[eid] = value\n }\n }\n }\n\n const ents = Array.from(deserializedEntities)\n\n deserializedEntities.clear()\n\n return ents\n }\n}", "import { resizeComponents } from './Component.js'\nimport { $notQueries, $queries, queryAddEntity, queryCheckEntity, queryRemoveEntity } from './Query.js'\nimport { $localEntities, $localEntityLookup, $manualEntityRecycling, $size, resizeWorlds } from './World.js'\nimport { setSerializationResized } from './Serialize.js'\n\nexport const $entityMasks = Symbol('entityMasks')\nexport const $entityComponents = Symbol('entityComponents')\nexport const $entitySparseSet = Symbol('entitySparseSet')\nexport const $entityArray = Symbol('entityArray')\nexport const $entityIndices = Symbol('entityIndices')\nexport const $removedEntities = Symbol('removedEntities')\n\nlet defaultSize = 100000\n\n// need a global EID cursor which all worlds and all components know about\n// so that world entities can posess entire rows spanning all component tables\nlet globalEntityCursor = 0\nlet globalSize = defaultSize\nlet resizeThreshold = () => globalSize - (globalSize / 5)\n\nexport const getGlobalSize = () => globalSize\n\n// removed eids should also be global to prevent memory leaks\nconst removed = []\nconst recycled = []\n\nconst defaultRemovedReuseThreshold = 0.01\nlet removedReuseThreshold = defaultRemovedReuseThreshold\n\nexport const resetGlobals = () => {\n globalSize = defaultSize\n globalEntityCursor = 0\n removedReuseThreshold = defaultRemovedReuseThreshold\n removed.length = 0\n recycled.length = 0\n}\n\nexport const getDefaultSize = () => defaultSize\n\n/**\n * Sets the default maximum number of entities for worlds and component stores.\n *\n * @param {number} newSize\n */\nexport const setDefaultSize = newSize => { \n const oldSize = globalSize\n\n defaultSize = newSize\n resetGlobals()\n\n globalSize = newSize\n resizeWorlds(newSize)\n resizeComponents(newSize)\n setSerializationResized(true)\n\n console.info(`\uD83D\uDC7E bitECS - resizing all data stores from ${oldSize} to ${newSize}`)\n}\n\n/**\n * Sets the number of entities that must be removed before removed entity ids begin to be recycled.\n * This should be set to as a % (0-1) of `defaultSize` that you would never likely remove/add on a single frame.\n *\n * @param {number} newThreshold\n */\nexport const setRemovedRecycleThreshold = newThreshold => {\n removedReuseThreshold = newThreshold\n}\n\nexport const getEntityCursor = () => globalEntityCursor\nexport const getRemovedEntities = () => [...recycled, ...removed]\n\nexport const eidToWorld = new Map()\n\nexport const flushRemovedEntities = (world) => {\n if (!world[$manualEntityRecycling]) {\n throw new Error(\"bitECS - cannot flush removed entities, enable feature with the enableManualEntityRecycling function\")\n }\n removed.push(...recycled)\n recycled.length = 0\n}\n\n/**\n * Adds a new entity to the specified world.\n *\n * @param {World} world\n * @returns {number} eid\n */\nexport const addEntity = (world) => {\n\n const eid = world[$manualEntityRecycling]\n ? removed.length ? removed.shift() : globalEntityCursor++\n : removed.length > Math.round(globalSize * removedReuseThreshold) ? removed.shift() : globalEntityCursor++\n\n if (eid > world[$size]) throw new Error(\"bitECS - max entities reached\")\n\n world[$entitySparseSet].add(eid)\n eidToWorld.set(eid, world)\n\n world[$notQueries].forEach(q => {\n const match = queryCheckEntity(world, q, eid)\n if (match) queryAddEntity(q, eid)\n })\n\n world[$entityComponents].set(eid, new Set())\n\n return eid\n}\n\n/**\n * Removes an existing entity from the specified world.\n *\n * @param {World} world\n * @param {number} eid\n */\nexport const removeEntity = (world, eid) => {\n // Check if entity is already removed\n if (!world[$entitySparseSet].has(eid)) return\n\n // Remove entity from all queries\n // TODO: archetype graph\n world[$queries].forEach(q => {\n queryRemoveEntity(world, q, eid)\n })\n\n // Free the entity\n if (world[$manualEntityRecycling])\n recycled.push(eid)\n else\n removed.push(eid)\n\n // remove all eid state from world\n world[$entitySparseSet].remove(eid)\n world[$entityComponents].delete(eid)\n\n // remove from deserializer mapping\n world[$localEntities].delete(world[$localEntityLookup].get(eid))\n world[$localEntityLookup].delete(eid)\n\n // Clear entity bitmasks\n for (let i = 0; i < world[$entityMasks].length; i++) world[$entityMasks][i][eid] = 0\n}\n\n/**\n * Returns an array of components that an entity possesses.\n *\n * @param {*} world\n * @param {*} eid\n */\nexport const getEntityComponents = (world, eid) => {\n if (eid === undefined) throw new Error('bitECS - entity is undefined.')\n if (!world[$entitySparseSet].has(eid)) throw new Error('bitECS - entity does not exist in the world.')\n return Array.from(world[$entityComponents].get(eid))\n}\n\n/**\n * Checks the existence of an entity in a world\n * \n * @param {World} world \n * @param {number} eid \n */\nexport const entityExists = (world, eid) => world[$entitySparseSet].has(eid)\n", "import { SparseSet } from './Util.js'\nimport { $queryShadow, $storeFlattened, $tagStore, createShadow } from './Storage.js'\nimport { $componentMap, registerComponent } from './Component.js'\nimport { $entityMasks, $entityArray, getEntityCursor, $entitySparseSet } from './Entity.js'\n\nexport const $modifier = Symbol(\"$modifier\")\n\nfunction modifier(c, mod) {\n const inner = () => [c, mod]\n inner[$modifier] = true\n return inner\n}\n\nexport const Not = (c) => modifier(c, 'not')\nexport const Or = (c) => modifier(c, 'or')\nexport const Changed = (c) => modifier(c, 'changed')\n\nexport function Any(...comps) { return function QueryAny() { return comps } }\nexport function All(...comps) { return function QueryAll() { return comps } }\nexport function None(...comps) { return function QueryNone() { return comps } }\n\nexport const $queries = Symbol('queries')\nexport const $notQueries = Symbol('notQueries')\n\nexport const $queryAny = Symbol('queryAny')\nexport const $queryAll = Symbol('queryAll')\nexport const $queryNone = Symbol('queryNone')\n\nexport const $queryMap = Symbol('queryMap')\nexport const $dirtyQueries = Symbol('$dirtyQueries')\nexport const $queryComponents = Symbol('queryComponents')\nexport const $enterQuery = Symbol('enterQuery')\nexport const $exitQuery = Symbol('exitQuery')\n\nconst empty = Object.freeze([])\n\n/**\n * Given an existing query, returns a new function which returns entities who have been added to the given query since the last call of the function.\n *\n * @param {function} query\n * @returns {function} enteredQuery\n */\nexport const enterQuery = query => world => {\n if (!world[$queryMap].has(query)) registerQuery(world, query)\n const q = world[$queryMap].get(query)\n if (q.entered.dense.length === 0) {\n return empty\n } else {\n const results = q.entered.dense.slice()\n q.entered.reset()\n return results\n }\n}\n\n/**\n * Given an existing query, returns a new function which returns entities who have been removed from the given query since the last call of the function.\n *\n * @param {function} query\n * @returns {function} enteredQuery\n */\nexport const exitQuery = query => world => {\n if (!world[$queryMap].has(query)) registerQuery(world, query)\n const q = world[$queryMap].get(query)\n if (q.exited.dense.length === 0) {\n return empty\n } else {\n const results = q.exited.dense.slice()\n q.exited.reset()\n return results\n }\n}\n\nexport const registerQuery = (world, query) => {\n\n const components = []\n const notComponents = []\n const changedComponents = []\n\n query[$queryComponents].forEach(c => {\n if (typeof c === \"function\" && c[$modifier]) {\n const [comp, mod] = c()\n if (!world[$componentMap].has(comp)) registerComponent(world, comp)\n if (mod === 'not') {\n notComponents.push(comp)\n }\n if (mod === 'changed') {\n changedComponents.push(comp)\n components.push(comp)\n }\n // if (mod === 'all') {\n // allComponents.push(comp)\n // }\n // if (mod === 'any') {\n // anyComponents.push(comp)\n // }\n // if (mod === 'none') {\n // noneComponents.push(comp)\n // }\n } else {\n if (!world[$componentMap].has(c)) registerComponent(world, c)\n components.push(c)\n }\n })\n\n\n const mapComponents = c => world[$componentMap].get(c)\n\n const allComponents = components.concat(notComponents).map(mapComponents)\n\n // const sparseSet = Uint32SparseSet(getGlobalSize())\n const sparseSet = SparseSet()\n\n const archetypes = []\n // const changed = SparseSet()\n const changed = []\n const toRemove = SparseSet()\n const entered = SparseSet()\n const exited = SparseSet()\n\n const generations = allComponents\n .map(c => c.generationId)\n .reduce((a,v) => {\n if (a.includes(v)) return a\n a.push(v)\n return a\n }, [])\n\n const reduceBitflags = (a,c) => {\n if (!a[c.generationId]) a[c.generationId] = 0\n a[c.generationId] |= c.bitflag\n return a\n }\n const masks = components\n .map(mapComponents)\n .reduce(reduceBitflags, {})\n\n const notMasks = notComponents\n .map(mapComponents)\n .reduce(reduceBitflags, {})\n\n // const orMasks = orComponents\n // .map(mapComponents)\n // .reduce(reduceBitmasks, {})\n\n const hasMasks = allComponents\n .reduce(reduceBitflags, {})\n\n const flatProps = components\n .filter(c => !c[$tagStore])\n .map(c => Object.getOwnPropertySymbols(c).includes($storeFlattened) ? c[$storeFlattened] : [c])\n .reduce((a,v) => a.concat(v), [])\n\n const shadows = []\n\n const q = Object.assign(sparseSet, {\n archetypes,\n changed,\n components,\n notComponents,\n changedComponents,\n allComponents,\n masks,\n notMasks,\n // orMasks,\n hasMasks,\n generations,\n flatProps,\n toRemove,\n entered,\n exited,\n shadows,\n })\n\n world[$queryMap].set(query, q)\n world[$queries].add(q)\n \n allComponents.forEach(c => {\n c.queries.add(q)\n })\n\n if (notComponents.length) world[$notQueries].add(q)\n\n for (let eid = 0; eid < getEntityCursor(); eid++) {\n if (!world[$entitySparseSet].has(eid)) continue\n const match = queryCheckEntity(world, q, eid)\n if (match) queryAddEntity(q, eid)\n }\n}\n\nconst generateShadow = (q, pid) => {\n const $ = Symbol()\n const prop = q.flatProps[pid]\n createShadow(prop, $)\n q.shadows[pid] = prop[$]\n return prop[$]\n}\n\nconst diff = (q, clearDiff) => {\n if (clearDiff) q.changed = []\n const { flatProps, shadows } = q\n for (let i = 0; i < q.dense.length; i++) {\n const eid = q.dense[i]\n let dirty = false\n for (let pid = 0; pid < flatProps.length; pid++) {\n const prop = flatProps[pid]\n const shadow = shadows[pid] || generateShadow(q, pid)\n if (ArrayBuffer.isView(prop[eid])) {\n for (let i = 0; i < prop[eid].length; i++) {\n if (prop[eid][i] !== shadow[eid][i]) {\n dirty = true\n break\n }\n }\n shadow[eid].set(prop[eid])\n } else {\n if (prop[eid] !== shadow[eid]) {\n dirty = true\n shadow[eid] = prop[eid]\n }\n }\n }\n if (dirty) q.changed.push(eid)\n }\n return q.changed\n}\n\n// const queryEntityChanged = (q, eid) => {\n// if (q.changed.has(eid)) return\n// q.changed.add(eid)\n// }\n\n// export const entityChanged = (world, component, eid) => {\n// const { changedQueries } = world[$componentMap].get(component)\n// changedQueries.forEach(q => {\n// const match = queryCheckEntity(world, q, eid)\n// if (match) queryEntityChanged(q, eid)\n// })\n// }\n\nconst flatten = (a,v) => a.concat(v)\n\nconst aggregateComponentsFor = mod => x => x.filter(f => f.name === mod().constructor.name).reduce(flatten)\n\nconst getAnyComponents = aggregateComponentsFor(Any)\nconst getAllComponents = aggregateComponentsFor(All)\nconst getNoneComponents = aggregateComponentsFor(None)\n\n/**\n * Defines a query function which returns a matching set of entities when called on a world.\n *\n * @param {array} components\n * @returns {function} query\n */\n\nexport const defineQuery = (...args) => {\n let components\n let any, all, none\n if (Array.isArray(args[0])) {\n components = args[0]\n } else {\n // any = getAnyComponents(args)\n // all = getAllComponents(args)\n // none = getNoneComponents(args)\n }\n \n\n if (components === undefined || components[$componentMap] !== undefined) {\n return world => world ? world[$entityArray] : components[$entityArray]\n }\n\n const query = function (world, clearDiff=true) {\n if (!world[$queryMap].has(query)) registerQuery(world, query)\n\n const q = world[$queryMap].get(query)\n\n commitRemovals(world)\n\n if (q.changedComponents.length) return diff(q, clearDiff)\n // if (q.changedComponents.length) return q.changed.dense\n\n return q.dense\n }\n\n query[$queryComponents] = components\n query[$queryAny] = any\n query[$queryAll] = all\n query[$queryNone] = none\n\n return query\n}\n\nconst bin = value => {\n if (!Number.isSafeInteger(value)) {\n throw new TypeError('value must be a safe integer');\n }\n\n const negative = value < 0;\n const twosComplement = negative ? Number.MAX_SAFE_INTEGER + value + 1 : value;\n const signExtend = negative ? '1' : '0';\n\n return twosComplement.toString(2).padStart(4, '0').padStart(0, signExtend);\n}\n\n// TODO: archetype graph\nexport const queryCheckEntity = (world, q, eid) => {\n const { masks, notMasks, generations } = q\n let or = 0\n for (let i = 0; i < generations.length; i++) {\n const generationId = generations[i]\n const qMask = masks[generationId]\n const qNotMask = notMasks[generationId]\n // const qOrMask = orMasks[generationId]\n const eMask = world[$entityMasks][generationId][eid]\n \n // any\n // if (qOrMask && (eMask & qOrMask) !== qOrMask) {\n // continue\n // }\n // not all \n // if (qNotMask && (eMask & qNotMask) === qNotMask) {\n // }\n // not any\n if (qNotMask && (eMask & qNotMask) !== 0) {\n return false\n }\n // all\n if (qMask && (eMask & qMask) !== qMask) {\n return false\n }\n }\n return true\n}\n\nexport const queryCheckComponent = (q, c) => {\n const { generationId, bitflag } = c\n const { hasMasks } = q\n const mask = hasMasks[generationId]\n return (mask & bitflag) === bitflag\n}\n\nexport const queryAddEntity = (q, eid) => {\n q.toRemove.remove(eid)\n // if (!q.has(eid)) \n q.entered.add(eid)\n q.add(eid)\n}\n\nconst queryCommitRemovals = (q) => {\n for (let i = q.toRemove.dense.length-1; i >= 0; i--) {\n const eid = q.toRemove.dense[i]\n q.toRemove.remove(eid)\n q.remove(eid)\n }\n}\n\nexport const commitRemovals = (world) => {\n if (!world[$dirtyQueries].size) return\n world[$dirtyQueries].forEach(queryCommitRemovals)\n world[$dirtyQueries].clear()\n}\n\nexport const queryRemoveEntity = (world, q, eid) => {\n if (!q.has(eid) || q.toRemove.has(eid)) return\n q.toRemove.add(eid)\n world[$dirtyQueries].add(q)\n q.exited.add(eid)\n}\n\n\n/**\n * Resets a Changed-based query, clearing the underlying list of changed entities.\n *\n * @param {World} world\n * @param {function} query\n */\nexport const resetChangedQuery = (world, query) => {\n const q = world[$queryMap].get(query)\n q.changed = []\n}\n\n/**\n * Removes a query from a world.\n *\n * @param {World} world\n * @param {function} query\n */\nexport const removeQuery = (world, query) => {\n const q = world[$queryMap].get(query)\n world[$queries].delete(q)\n world[$queryMap].delete(query)\n}", "import { $storeSize, createStore, resetStoreFor, resizeStore } from './Storage.js'\nimport { $queries, queryAddEntity, queryRemoveEntity, queryCheckEntity, commitRemovals } from './Query.js'\nimport { $bitflag, $size } from './World.js'\nimport { $entityMasks, getDefaultSize, eidToWorld, $entityComponents, getGlobalSize, $entitySparseSet } from './Entity.js'\n\nexport const $componentMap = Symbol('componentMap')\n\nexport const components = []\n\nexport const resizeComponents = (size) => {\n components.forEach(component => resizeStore(component, size))\n}\n\n\n/**\n * Defines a new component store.\n *\n * @param {object} schema\n * @returns {object}\n */\nexport const defineComponent = (schema, size) => {\n const component = createStore(schema, size || getGlobalSize())\n if (schema && Object.keys(schema).length) components.push(component)\n return component\n}\n\nexport const incrementBitflag = (world) => {\n world[$bitflag] *= 2\n if (world[$bitflag] >= 2**31) {\n world[$bitflag] = 1\n world[$entityMasks].push(new Uint32Array(world[$size]))\n }\n}\n\n\n/**\n * Registers a component with a world.\n *\n * @param {World} world\n * @param {Component} component\n */\nexport const registerComponent = (world, component) => {\n if (!component) throw new Error(`bitECS - Cannot register null or undefined component`)\n\n const queries = new Set()\n const notQueries = new Set()\n const changedQueries = new Set()\n\n world[$queries].forEach(q => {\n if (q.allComponents.includes(component)) {\n queries.add(q)\n }\n })\n\n world[$componentMap].set(component, { \n generationId: world[$entityMasks].length - 1,\n bitflag: world[$bitflag],\n store: component,\n queries,\n notQueries,\n changedQueries,\n })\n\n incrementBitflag(world)\n}\n\n/**\n * Registers multiple components with a world.\n *\n * @param {World} world\n * @param {Component} components\n */\nexport const registerComponents = (world, components) => {\n components.forEach(c => registerComponent(world, c))\n}\n\n/**\n * Checks if an entity has a component.\n *\n * @param {World} world\n * @param {Component} component\n * @param {number} eid\n * @returns {boolean}\n */\nexport const hasComponent = (world, component, eid) => {\n const registeredComponent = world[$componentMap].get(component)\n if (!registeredComponent) return false\n const { generationId, bitflag } = registeredComponent\n const mask = world[$entityMasks][generationId][eid]\n return (mask & bitflag) === bitflag\n}\n\n/**\n * Adds a component to an entity\n *\n * @param {World} world\n * @param {Component} component\n * @param {number} eid\n * @param {boolean} [reset=false]\n */\nexport const addComponent = (world, component, eid, reset=false) => {\n if (eid === undefined) throw new Error('bitECS - entity is undefined.')\n if (!world[$entitySparseSet].has(eid)) throw new Error('bitECS - entity does not exist in the world.')\n if (!world[$componentMap].has(component)) registerComponent(world, component)\n if (hasComponent(world, component, eid)) return\n\n const c = world[$componentMap].get(component)\n const { generationId, bitflag, queries, notQueries } = c\n \n // Add bitflag to entity bitmask\n world[$entityMasks][generationId][eid] |= bitflag\n\n // todo: archetype graph\n queries.forEach(q => {\n // remove this entity from toRemove if it exists in this query\n q.toRemove.remove(eid)\n const match = queryCheckEntity(world, q, eid)\n if (match) {\n q.exited.remove(eid)\n queryAddEntity(q, eid)\n }\n if (!match) {\n q.entered.remove(eid)\n queryRemoveEntity(world, q, eid)\n }\n })\n\n world[$entityComponents].get(eid).add(component)\n\n // Zero out each property value\n if (reset) resetStoreFor(component, eid)\n}\n\n/**\n * Removes a component from an entity and resets component state unless otherwise specified.\n *\n * @param {World} world\n * @param {Component} component\n * @param {number} eid\n * @param {boolean} [reset=true]\n */\nexport const removeComponent = (world, component, eid, reset=true) => {\n if (eid === undefined) throw new Error('bitECS - entity is undefined.')\n if (!world[$entitySparseSet].has(eid)) throw new Error('bitECS - entity does not exist in the world.')\n if (!hasComponent(world, component, eid)) return\n\n const c = world[$componentMap].get(component)\n const { generationId, bitflag, queries } = c\n\n // Remove flag from entity bitmask\n world[$entityMasks][generationId][eid] &= ~bitflag\n \n // todo: archetype graph\n queries.forEach(q => {\n // remove this entity from toRemove if it exists in this query\n q.toRemove.remove(eid)\n const match = queryCheckEntity(world, q, eid)\n if (match) {\n q.exited.remove(eid)\n queryAddEntity(q, eid)\n }\n if (!match) {\n q.entered.remove(eid)\n queryRemoveEntity(world, q, eid)\n }\n })\n\n world[$entityComponents].get(eid).delete(component)\n\n // Zero out each property value\n if (reset) resetStoreFor(component, eid)\n}\n", "import { $componentMap } from './Component.js'\nimport { $queryMap, $queries, $dirtyQueries, $notQueries } from './Query.js'\nimport { $entityArray, $entityComponents, $entityMasks, $entitySparseSet, getGlobalSize, removeEntity } from './Entity.js'\nimport { resize } from './Storage.js'\nimport { SparseSet } from './Util.js'\n\nexport const $size = Symbol('size')\nexport const $resizeThreshold = Symbol('resizeThreshold')\nexport const $bitflag = Symbol('bitflag')\nexport const $archetypes = Symbol('archetypes')\nexport const $localEntities = Symbol('localEntities')\nexport const $localEntityLookup = Symbol('localEntityLookup')\nexport const $manualEntityRecycling = Symbol('manualEntityRecycling')\n\nexport const worlds = []\n\nexport const resizeWorlds = (size) => {\n worlds.forEach(world => {\n world[$size] = size\n\n for (let i = 0; i < world[$entityMasks].length; i++) {\n const masks = world[$entityMasks][i];\n world[$entityMasks][i] = resize(masks, size)\n }\n \n world[$resizeThreshold] = world[$size] - (world[$size] / 5)\n })\n}\n\n/**\n * Creates a new world.\n *\n * @returns {object}\n */\nexport const createWorld = (...args) => {\n const world = typeof args[0] === 'object'\n ? args[0]\n : {}\n const size = typeof args[0] === 'number' \n ? args[0] \n : typeof args[1] === 'number' \n ? args[1] \n : getGlobalSize()\n resetWorld(world, size)\n worlds.push(world)\n return world\n}\n\nexport const enableManualEntityRecycling = (world) => {\n world[$manualEntityRecycling] = true\n}\n\n/**\n * Resets a world.\n *\n * @param {World} world\n * @returns {object}\n */\nexport const resetWorld = (world, size = getGlobalSize()) => {\n world[$size] = size\n\n if (world[$entityArray]) world[$entityArray].forEach(eid => removeEntity(world, eid))\n\n world[$entityMasks] = [new Uint32Array(size)]\n world[$entityComponents] = new Map()\n world[$archetypes] = []\n\n world[$entitySparseSet] = SparseSet()\n world[$entityArray] = world[$entitySparseSet].dense\n\n world[$bitflag] = 1\n\n world[$componentMap] = new Map()\n\n world[$queryMap] = new Map()\n world[$queries] = new Set()\n world[$notQueries] = new Set()\n world[$dirtyQueries] = new Set()\n\n world[$localEntities] = new Map()\n world[$localEntityLookup] = new Map()\n\n world[$manualEntityRecycling] = false\n\n return world\n}\n\n/**\n * Deletes a world.\n *\n * @param {World} world\n */\nexport const deleteWorld = (world) => {\n Object.getOwnPropertySymbols(world).forEach($ => { delete world[$] })\n Object.keys(world).forEach(key => { delete world[key] })\n worlds.splice(worlds.indexOf(world), 1)\n}\n\n/**\n * Returns all components registered to a world\n * \n * @param {World} world \n * @returns Array\n */\nexport const getWorldComponents = (world) => Array.from(world[$componentMap].keys())\n\n/**\n * Returns all existing entities in a world\n * \n * @param {World} world \n * @returns Array\n */\nexport const getAllEntities = (world) => world[$entitySparseSet].dense.slice(0)", "/**\n * Defines a new system function.\n *\n * @param {function} update\n * @returns {function}\n */\n export const defineSystem = (update) => (world, ...args) => {\n update(world, ...args)\n return world\n}", "import { createWorld, resetWorld, deleteWorld, getWorldComponents, getAllEntities, enableManualEntityRecycling } from './World.js'\nimport { addEntity, removeEntity, setDefaultSize, setRemovedRecycleThreshold, getEntityComponents, entityExists, flushRemovedEntities, resetGlobals } from './Entity.js'\nimport { defineComponent, registerComponent, registerComponents, hasComponent, addComponent, removeComponent } from './Component.js'\nimport { defineSystem } from './System.js'\nimport { defineQuery, enterQuery, exitQuery, Changed, Not, commitRemovals, resetChangedQuery, removeQuery } from './Query.js'\nimport { defineSerializer, defineDeserializer, DESERIALIZE_MODE } from './Serialize.js'\nimport { parentArray } from './Storage.js'\nimport { TYPES_ENUM } from './Constants.js'\n\nexport const pipe = (...fns) => (input) => {\n let tmp = input\n for (let i = 0; i < fns.length; i++) {\n const fn = fns[i]\n tmp = fn(tmp)\n }\n return tmp\n}\n\nexport const Types = TYPES_ENUM\n\nexport {\n\n setDefaultSize,\n setRemovedRecycleThreshold,\n createWorld,\n resetWorld,\n deleteWorld,\n addEntity,\n removeEntity,\n entityExists,\n getWorldComponents,\n enableManualEntityRecycling,\n flushRemovedEntities,\n getAllEntities,\n \n registerComponent,\n registerComponents,\n defineComponent,\n addComponent,\n removeComponent,\n hasComponent,\n getEntityComponents,\n\n defineQuery,\n Changed,\n Not,\n enterQuery,\n exitQuery,\n commitRemovals,\n resetChangedQuery,\n removeQuery,\n\n defineSystem,\n \n defineSerializer,\n defineDeserializer,\n DESERIALIZE_MODE,\n\n parentArray,\n\n resetGlobals\n\n}\n"],
"mappings": "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",
"names": []
}