45 lines
1.0 KiB
JavaScript
45 lines
1.0 KiB
JavaScript
|
"use strict";
|
||
|
Object.defineProperty(exports, "__esModule", { value: true });
|
||
|
exports.createRace = void 0;
|
||
|
/**
|
||
|
* Constructs a function that will only invoke the first function passed to it
|
||
|
* concurrently. Once the function has been executed, the racer will be reset
|
||
|
* and the next invocation will be allowed to execute.
|
||
|
*
|
||
|
* Example:
|
||
|
*
|
||
|
* ```ts
|
||
|
* import {createRace} from 'thingies/es2020/createRace';
|
||
|
*
|
||
|
* const race = createRace();
|
||
|
*
|
||
|
* race(() => {
|
||
|
* race(() => {
|
||
|
* console.log('This will not be executed');
|
||
|
* });
|
||
|
* console.log('This will be executed');
|
||
|
* });
|
||
|
*
|
||
|
* race(() => {
|
||
|
* console.log('This will be executed');
|
||
|
* });
|
||
|
* ```
|
||
|
*
|
||
|
* @returns A "race" function that will only invoke the first function passed to it.
|
||
|
*/
|
||
|
const createRace = () => {
|
||
|
let invoked = false;
|
||
|
return (fn) => {
|
||
|
if (invoked)
|
||
|
return;
|
||
|
invoked = true;
|
||
|
try {
|
||
|
return fn();
|
||
|
}
|
||
|
finally {
|
||
|
invoked = false;
|
||
|
}
|
||
|
};
|
||
|
};
|
||
|
exports.createRace = createRace;
|