All files / src batch.ts

100% Statements 29/29
100% Branches 9/9
100% Functions 3/3
100% Lines 29/29

Press n or j to go to the next uncovered block, b, p or k for the previous block.

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 412x 2x           2x   2x   2x 346x 346x 346x 421x 421x 421x 421x 5x 5x 421x   346x   346x 3x 3x 346x 346x   2x 47x   47x 47x 47x 47x 47x 47x  
import { context } from "./context";
import { UNIQUE_VALUE } from "./utils";
 
export type BatchTask<O extends object = object> = O & {
  task_: () => void;
};
 
export const tasks: Set<BatchTask> = /* @__PURE__ */ (() => context.tasks_)();
 
export const batchStart = (): boolean => !context.batching_ && (context.batching_ = true);
 
export const batchFlush = (): void => {
  if (context.batching_) {
    let error: unknown = UNIQUE_VALUE;
    for (const task of tasks) {
      tasks.delete(task);
      try {
        task.task_();
      } catch (e) {
        error = e;
      }
    }
 
    context.batching_ = false;
 
    if (error !== UNIQUE_VALUE) {
      throw error;
    }
  }
};
 
export const batch = <T>(fn: () => T, thisArg?: any): T => {
  const isFirst = batchStart();
 
  try {
    return fn.call(thisArg);
  } finally {
    isFirst && batchFlush();
  }
};