UNPKG

superfly-timeline

Version:

Resolver for defining objects with temporal boolean logic relationships on a timeline

102 lines 3.63 kB
"use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports.isReference = exports.joinReferences = exports.getRefInstanceId = exports.isInstanceReference = exports.getRefLayer = exports.isLayerReference = exports.getRefClass = exports.isClassReference = exports.isParentReference = exports.getRefObjectId = exports.isObjectReference = void 0; const lib_1 = require("./lib"); const performance_1 = require("./performance"); /* * References are strings that are added to instances, * to indicate what objects, layers or classes they are derived from. */ function isObjectReference(ref) { return ref.startsWith('#'); } exports.isObjectReference = isObjectReference; function getRefObjectId(ref) { return ref.slice(1); } exports.getRefObjectId = getRefObjectId; function isParentReference(ref) { return ref == '##parent'; } exports.isParentReference = isParentReference; function isClassReference(ref) { return ref.startsWith('.'); } exports.isClassReference = isClassReference; function getRefClass(ref) { return ref.slice(1); } exports.getRefClass = getRefClass; function isLayerReference(ref) { return ref.startsWith('$'); } exports.isLayerReference = isLayerReference; function getRefLayer(ref) { return ref.slice(1); } exports.getRefLayer = getRefLayer; function isInstanceReference(ref) { return ref.startsWith('@'); } exports.isInstanceReference = isInstanceReference; function getRefInstanceId(ref) { return ref.slice(1); } exports.getRefInstanceId = getRefInstanceId; /** Add / join references Arrays. Returns a sorted list of unique references */ function joinReferences(references, ...addReferences) { const toc = (0, performance_1.tic)(' joinReferences'); // Fast path: When nothing is added, return the original references: if (addReferences.length === 1 && typeof addReferences[0] !== 'string' && addReferences[0].length === 0) { return [...references]; } let fastPath = false; let resultingRefs = []; // Fast path: When a single ref is added if (addReferences.length === 1 && typeof addReferences[0] === 'string') { if (references.includes(addReferences[0])) { // The value already exists, return the original references: return [...references]; } else { // just quickly add the reference and jump forward to sorting of resultingRefs: resultingRefs = [...references]; resultingRefs.push(addReferences[0]); fastPath = true; } } if (!fastPath) { const refSet = new Set(); for (const ref of references) { if (!refSet.has(ref)) { refSet.add(ref); resultingRefs.push(ref); } } for (const addReference of addReferences) { if (typeof addReference === 'string') { if (!refSet.has(addReference)) { refSet.add(addReference); resultingRefs.push(addReference); } } else { for (const ref of addReference) { if (!refSet.has(ref)) { refSet.add(ref); resultingRefs.push(ref); } } } } } resultingRefs.sort(lib_1.compareStrings); toc(); return resultingRefs; } exports.joinReferences = joinReferences; function isReference(ref) { return ref !== null && typeof ref.value === 'number'; } exports.isReference = isReference; //# sourceMappingURL=reference.js.map