Skip to content

Commit 163088d

Browse files
committed
Optimize Fuse reuse in search
1 parent f2d6e80 commit 163088d

1 file changed

Lines changed: 27 additions & 11 deletions

File tree

src/utility/searchEpisodes.ts

Lines changed: 27 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -1,21 +1,37 @@
11
import Fuse from "fuse.js";
22
import type { Episode } from "src/types/Episode";
33

4+
const fuseOptions = {
5+
shouldSort: true,
6+
findAllMatches: true,
7+
threshold: 0.4,
8+
isCaseSensitive: false,
9+
keys: ["title"],
10+
};
11+
12+
const fuseCache = new WeakMap<Episode[], { fuse: Fuse<Episode>; size: number }>();
13+
14+
function getFuse(episodes: Episode[]): Fuse<Episode> {
15+
const cached = fuseCache.get(episodes);
16+
17+
if (cached && cached.size === episodes.length) {
18+
return cached.fuse;
19+
}
20+
21+
const newFuse = new Fuse(episodes, fuseOptions);
22+
fuseCache.set(episodes, { fuse: newFuse, size: episodes.length });
23+
24+
return newFuse;
25+
}
26+
427
export default function searchEpisodes(query: string, episodes: Episode[]): Episode[] {
5-
if (episodes.length === 0) return [];
28+
if (episodes.length === 0) return [];
629

730
if (query.length === 0) {
831
return episodes;
9-
}
10-
11-
const fuse = new Fuse(episodes, {
12-
shouldSort: true,
13-
findAllMatches: true,
14-
threshold: 0.4,
15-
isCaseSensitive: false,
16-
keys: ['title'],
17-
});
18-
32+
}
33+
34+
const fuse = getFuse(episodes);
1935
const searchResults = fuse.search(query);
2036
return searchResults.map(resItem => resItem.item);
2137
}

0 commit comments

Comments
 (0)