Skip to content

Commit

Permalink
Use optimizedMapWithForLoop and optimizedFilterWithForLoop
Browse files Browse the repository at this point in the history
  • Loading branch information
robertherber committed Mar 30, 2024
1 parent 2c9c1f6 commit 0fffbee
Showing 1 changed file with 34 additions and 5 deletions.
39 changes: 34 additions & 5 deletions packages/utils/node/SuperDataLoader.ts
Original file line number Diff line number Diff line change
Expand Up @@ -10,7 +10,7 @@ async function dealWithKeys<T, TKey = string>(
// eslint-disable-next-line functional/prefer-readonly-type
dataCache: Map<string, unknown>,
) {
const originalKeys = keys.map(([key]) => key!)
const originalKeys = optimizedMapWithForLoop(keys, ([originalKey]) => originalKey!)
const results = await batchLoadFn(
originalKeys,
)
Expand All @@ -30,6 +30,35 @@ async function dealWithKeys<T, TKey = string>(
}
}

function optimizedMapWithForLoop<TData, TReturn>(data: readonly TData[], mapFn: (data: TData) => TReturn) {
// eslint-disable-next-line functional/prefer-readonly-type
const result: TReturn[] = new Array<TReturn>(data.length)

// eslint-disable-next-line no-plusplus
for (let i = 0; i < data.length; i++) {
// eslint-disable-next-line functional/immutable-data
result[i] = mapFn(data[i]!)
}

return result
}

function optimizedFilterWithForLoop<TData>(data: readonly TData[], filterFn: (data: TData) => boolean) {
// eslint-disable-next-line functional/prefer-readonly-type
const result: TData[] = new Array<TData>()

// eslint-disable-next-line no-plusplus
for (let i = 0; i < data.length; i++) {
const value = data[i]!
if (filterFn(value)) {
// eslint-disable-next-line functional/immutable-data
result.concat(value)
}
}

return result
}

export function createSuperDataLoader<T, TKey = string>({
batchLoadFn,
cacheKeyFn,
Expand Down Expand Up @@ -97,11 +126,11 @@ export function createSuperDataLoader<T, TKey = string>({

// eslint-disable-next-line @typescript-eslint/promise-function-async
const loadMany = (keys: readonly TKey[]) => {
const cacheKeys = keys.map(getKeyWithOriginal)
const keysWithoutCache = cacheKeys.filter(doesNotHaveKeyWithOriginal)
const cacheKeys = optimizedMapWithForLoop(keys, getKeyWithOriginal)
const keysWithoutCache = optimizedFilterWithForLoop(cacheKeys, doesNotHaveKeyWithOriginal)

if (keysWithoutCache.length === 0) {
return cacheKeys.map(dataFromCacheWithOriginal)
return optimizedMapWithForLoop(cacheKeys, dataFromCacheWithOriginal)
}

if (keysToResolveOnNextTick.size === 0) {
Expand All @@ -115,7 +144,7 @@ export function createSuperDataLoader<T, TKey = string>({
keysToResolveOnNextTick.set(keyStr, originalKey)
}

return onNextTick!.then(() => cacheKeys.map(dataFromCacheWithOriginal))
return onNextTick!.then(() => optimizedMapWithForLoop(cacheKeys, dataFromCacheWithOriginal))
}

// eslint-disable-next-line @typescript-eslint/promise-function-async
Expand Down

0 comments on commit 0fffbee

Please sign in to comment.