rc-js-util
Version:
A collection of TS and C++ utilities to help writing performant and correct applications, achieved through strict typing and (removable) invariant checking.
30 lines (26 loc) • 1 kB
text/typescript
import { _Debug } from "../../debug/_debug.js";
/**
* @public
* Runs the `callback` within the `wrapperFunctions`. This is useful for "positional" attributes, like debug labels, lifecycle block scopes etc.
* @remarks
* See {@link fpRunWithin}.
*/
export function fpRunWithin<TCallback extends (...args: unknown[]) => unknown>
(
wrapperFunctions: readonly ((callback: () => ReturnType<TCallback>) => ReturnType<TCallback>)[],
callback: TCallback
)
: (...args: Parameters<TCallback>) => ReturnType<TCallback>
{
_BUILD.DEBUG && _Debug.assert(wrapperFunctions.length > 0, "there must be at least one wrapper function");
return (...args: Parameters<TCallback>): ReturnType<TCallback> =>
{
let chained = () => (callback(...args) as ReturnType<TCallback>);
for (let i = 0, iEnd = wrapperFunctions.length; i < iEnd; ++i)
{
const prev = chained;
chained = () => wrapperFunctions[i](prev);
}
return chained();
};
}