superfly-timeline
Version:
Resolver for defining objects with temporal boolean logic relationships on a timeline
102 lines • 3.63 kB
JavaScript
;
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