import { FunctionPromiseIdentity, PromiseFn, PromiseLikeReturnType } from '../types'; type JustOnceFn = FunctionPromiseIdentity & { reset: () => void; }; function justOnce(fn: Fn): JustOnceFn { let isAlreadyExecuted = false; let returnedValue: PromiseLikeReturnType | null = null; async function execute(...args: Parameters): Promise> { if (isAlreadyExecuted) return returnedValue as PromiseLikeReturnType; returnedValue = await fn(...args); isAlreadyExecuted = true; return returnedValue as PromiseLikeReturnType; } execute.reset = () => { isAlreadyExecuted = false; returnedValue = null; }; return execute; } export { justOnce };