import { NodeIDStrict, AddressNode, AddressDataset, } from "./Types"; interface QueryArgs { ofCountry?: NodeIDStrict; } export function defaultQueryArgs(): QueryArgs { return { }; } type Matcher = ( query: string, queryArg: QueryArgs, node: AddressNode ) => boolean; export function matchNameZh( query: string, queryArg: QueryArgs, node: AddressNode ): boolean { return (node.nameZh || "").toString().indexOf(query) > -1; } export function matchNamePyAbbr( query: string, queryArg: QueryArgs, node: AddressNode ): boolean { if (query.length < 2) { return false; } return (node.namePyAbbr || "").toString().indexOf(query) == 0; } export function matchNamePy( query: string, queryArg: QueryArgs, node: AddressNode ): boolean { if (query.length < 3) { return false; } return (node.namePyJoined || "").toString().indexOf(query) == 0; } export function doSearch( query: string, queryArgs: QueryArgs, store: AddressDataset ): NodeIDStrict[] { query = query.trim().toLowerCase(); return Object.keys(store.allNodesSet).filter(nid => { const node = store.allNodesSet[nid]; if (queryArgs.ofCountry) { if (node.ofCountry !== queryArgs.ofCountry) { return false; } } const doMatch = (matcher: Matcher) => matcher(query, queryArgs, node); return ( doMatch(matchNameZh) || doMatch(matchNamePyAbbr) || doMatch(matchNamePy) ); }); }