Press n or j to go to the next uncovered block, b, p or k for the previous block.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 | 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x | import { keyBy } from "../../clientUtils/Util" import fuzzysort from "fuzzysort" export class FuzzySearch<T> { strings: (Fuzzysort.Prepared | undefined)[] datamap: any constructor(data: T[], key: string) { this.datamap = keyBy(data, key) this.strings = data.map((d: any) => fuzzysort.prepare(d[key])) } search(input: string): T[] { return fuzzysort .go(input, this.strings) .map((result: any) => this.datamap[result.target]) } single(input: string, target: string): Fuzzysort.Result | null { return fuzzysort.single(input, target) } highlight(input: string, target: string): string { const result = fuzzysort.single(input, target) return highlight(result) ?? target } } export function highlight(result: Fuzzysort.Result | null): string | null { // The type definition of fuzzysort.highlight is wrong: It won't accept `undefined` as input, // but will happily accept `null`. That's why we use this wrapper here so we can actually call it. // Don't call fuzzysort.highlight directly if the value can be null or undefined, since one will // result in a type error and the other in a runtime error! return fuzzysort.highlight(result!) } |