diff --git a/lib/util/memoize.spec.ts b/lib/util/memoize.spec.ts new file mode 100644 index 0000000000000000000000000000000000000000..743d33295aa098dcb2adcea35382e3e709c8f15f --- /dev/null +++ b/lib/util/memoize.spec.ts @@ -0,0 +1,17 @@ +import { memoize } from './memoize'; + +describe('util/memoize', () => { + let calledTimes = 0; + + it('works', () => { + const fn = (): number => { + calledTimes += 1; + return calledTimes; + }; + const memFn = memoize(fn); + + expect(memFn()).toBe(1); + expect(memFn()).toBe(1); + expect(calledTimes).toBe(1); + }); +}); diff --git a/lib/util/memoize.ts b/lib/util/memoize.ts new file mode 100644 index 0000000000000000000000000000000000000000..ae3be629d338582a5b549c6282908ed12bc0d40c --- /dev/null +++ b/lib/util/memoize.ts @@ -0,0 +1,17 @@ +interface Result<T = unknown> { + res: T; +} + +export function memoize<T = unknown>(callback: () => T): () => T { + let memo: null | Result<T> = null; + + return (): T => { + if (memo) { + return memo.res; + } + + const res = callback(); + memo = { res }; + return res; + }; +} diff --git a/lib/workers/repository/update/pr/index.ts b/lib/workers/repository/update/pr/index.ts index 55ef9ded48c705db0e784fe6d56ec3146c86f5b6..2b8b01b932850e26469147db04bcf05319e725c3 100644 --- a/lib/workers/repository/update/pr/index.ts +++ b/lib/workers/repository/update/pr/index.ts @@ -12,6 +12,7 @@ import { BranchStatus } from '../../../../types'; import { ExternalHostError } from '../../../../types/errors/external-host-error'; import { stripEmojis } from '../../../../util/emoji'; import { deleteBranch, getBranchLastCommitTime } from '../../../../util/git'; +import { memoize } from '../../../../util/memoize'; import { regEx } from '../../../../util/regex'; import { Limit, incLimitedValue, isLimitReached } from '../../../global/limits'; import type { @@ -63,15 +64,9 @@ export type EnsurePrResult = ResultWithPr | ResultWithoutPr; export async function ensurePr( prConfig: BranchConfig ): Promise<EnsurePrResult> { - let branchStatus: BranchStatus; - async function getBranchStatus(): Promise<BranchStatus> { - if (branchStatus) { - return branchStatus; - } - branchStatus = await resolveBranchStatus(branchName, ignoreTests); - logger.debug(`Branch status is: ${branchStatus}`); - return branchStatus; - } + const getBranchStatus = memoize(() => + resolveBranchStatus(branchName, ignoreTests) + ); const config: BranchConfig = { ...prConfig };