mirror of
https://github.com/jaandrle/deka-dom-el
synced 2025-04-11 15:15:33 +02:00
40 lines
775 B
JavaScript
40 lines
775 B
JavaScript
/**
|
|
* Symbol used to identify signals in objects
|
|
* @type {string}
|
|
*/
|
|
export const mark= "__dde_signal";
|
|
|
|
/**
|
|
* Batches signal updates to improve performance
|
|
* @type {Function}
|
|
*/
|
|
export const queueSignalWrite= (()=> {
|
|
let pendingSignals= new Set();
|
|
let scheduled= false;
|
|
|
|
/**
|
|
* Processes all pending signal updates
|
|
* @private
|
|
*/
|
|
function flushSignals() {
|
|
scheduled = false;
|
|
const todo= pendingSignals;
|
|
pendingSignals= new Set();
|
|
for(const signal of todo){
|
|
const M = signal[mark];
|
|
if(M) M.listeners.forEach(l => l(M.value));
|
|
}
|
|
}
|
|
|
|
/**
|
|
* Queues a signal for update
|
|
* @param {Object} s - Signal to queue
|
|
*/
|
|
return function(s){
|
|
pendingSignals.add(s);
|
|
if(scheduled) return;
|
|
scheduled = true;
|
|
queueMicrotask(flushSignals);
|
|
};
|
|
})();
|