reactronic-dom
Version:
Reactronic DOM - Transactional Reactive Front-End Development Framework
73 lines (72 loc) • 2.61 kB
JavaScript
export const SymDataForSensor = Symbol('DataForSensor');
export const SymResizeObserver = Symbol('ResizeObserver');
export const EmptyDataArray = [];
export function findTargetElementData(targetPath, underPointer, sym, anyOfPayloadKeys, ignoreWindow = false) {
let result = undefined;
let i = 0;
let window = undefined;
while (i < targetPath.length) {
const candidate = targetPath[i];
const candidateData = candidate[sym];
if (candidateData !== undefined) {
if (!ignoreWindow) {
if (window === undefined)
window = candidateData['window'];
else if (window !== candidateData['window'])
break;
}
if (result === undefined) {
for (const payloadKey of anyOfPayloadKeys) {
const payload = candidateData[payloadKey];
if (payload !== undefined && underPointer.includes(candidate)) {
result = candidateData;
break;
}
}
}
}
i++;
}
return { data: result, window };
}
export function grabElementDataList(targetPath, sym, payloadKey, existing, ignoreWindow = false, predicate = () => false) {
let result = existing;
let i = 0;
let j = 0;
let window = undefined;
let activeData = undefined;
while (i < targetPath.length) {
let payload = undefined;
const candidate = targetPath[i];
const candidateData = candidate[sym];
if (candidateData !== undefined) {
if (!ignoreWindow) {
if (window === undefined)
window = candidateData['window'];
else if (window !== candidateData['window'])
break;
}
payload = candidateData[payloadKey];
if (payload !== undefined) {
if (result !== existing) {
result.push(payload);
}
else {
if (payload !== existing[j]) {
result = existing.slice(0, j);
result.push(payload);
}
else
j++;
}
}
}
if (activeData === undefined && predicate(candidate)) {
activeData = payload;
}
i++;
}
if (j === 0 && result === existing && existing.length > 0)
result = EmptyDataArray;
return { dataList: result, window, activeData };
}