{"version":3,"file":"index.umd.production.min.cjs","sources":["../src/append.ts","../src/create.ts","../src/recursePrefix.ts","../src/config.ts","../src/permutations.ts","../src/recurseRandomWord.ts","../src/index.ts","../src/checkPrefix.ts"],"sourcesContent":["import { END_WORD } from '@lazy-trie/types';\nimport { ITrie, ITrieNode } from './create';\n\nexport function append<T>(trie: ITrie<T>, letter: string, index: number, array: string[]): ITrieNode<T>\n{\n\ttrie[letter] = trie[letter] || {};\n\ttrie = trie[letter];\n\n\tif (index === array.length - 1)\n\t{\n\t\ttrie[END_WORD] = null;\n\t}\n\n\treturn trie;\n}\n\nexport default append;\n","import { append } from './append';\nimport { END_DEF, END_VALUE } from './config';\nimport { IInput } from './index';\nimport { split } from '@lazy-trie/util';\nimport { END_WORD } from '@lazy-trie/types';\n\nexport type ITrie<T = typeof END_VALUE> = ITrieNode<T> | ITrieRaw<T>;\n\nexport interface ITrieNode<T = typeof END_VALUE>\n{\n\t[k: string]: ITrieNode<T>,\n\n\t//@ts-ignore\n\t'$$'?: ITrieNodeValue<T>,\n\t//@ts-ignore\n\t[END_WORD]?: ITrieNodeValue<T>,\n}\n\nexport interface ITrieNodeValue<T = typeof END_VALUE>\n{\n\t[k: string]: T,\n\n\t[END_DEF]: string,\n}\n\nexport interface ITrieRaw<T = typeof END_VALUE>\n{\n\t[k: string]: ITrieNode<T>\n}\n\nexport function create<T>(input: IInput<T>, ...argv): ITrieRaw<T>\n{\n\tif (!Array.isArray(input))\n\t{\n\t\tthrow new TypeError(`Expected parameter Array, received ${typeof input}`);\n\t}\n\n\tconst trie = input.reduce((accumulator, item) =>\n\t{\n\t\t//split(item.toLowerCase())\n\t\tsplit(item)\n\t\t\t.reduce(append, accumulator)\n\t\t;\n\n\t\treturn accumulator;\n\t}, {});\n\n\treturn trie;\n}\n\nexport default create;\n\nexport function isEndpoint<T>(value: ITrie<T>, key: string, trie: ITrie<T>): value is ITrieNode<T>\n{\n\treturn key === END_WORD;\n}\n\nexport function hasEndpoint<T>(node: ITrie<T>): node is ITrieNode<T>\n{\n\treturn END_WORD in node;\n}\n","import { END_WORD } from '@lazy-trie/types';\nimport { ITrie } from './create';\n\n// sort items as they're being found\n// to prevent slow .sort() in NodeJs\nexport function pushInOrder<T>(word: T, prefixes: T[])\n{\n\tlet i = 0;\n\n\twhile (i < prefixes.length)\n\t{\n\t\tif (word < prefixes[i])\n\t\t{\n\t\t\tbreak;\n\t\t}\n\t\ti += 1;\n\t}\n\n\tprefixes.splice(i, 0, word);\n\n\treturn prefixes;\n}\n\nexport function recursePrefix<T>(node: ITrie<T>, prefix: string, sorted: boolean, prefixes: string[] = []): string[]\n{\n\tlet word = prefix;\n\n\tfor (const branch in node)\n\t{\n\t\t// @ts-ignore\n\t\tif (branch === END_WORD)\n\t\t{\n\t\t\tif (sorted)\n\t\t\t{\n\t\t\t\tpushInOrder(word, prefixes);\n\t\t\t}\n\t\t\telse\n\t\t\t{\n\t\t\t\tprefixes.push(word);\n\t\t\t}\n\t\t\tword = '';\n\t\t}\n\t\trecursePrefix(node[branch], prefix + branch, sorted, prefixes);\n\t}\n\n\treturn prefixes;\n}\n\nexport default recursePrefix;\n","\nexport const END_VALUE: any = Object.freeze({});\nexport const END_DEF = Symbol('default');\n\nexport const PERMS_MIN_LEN = 2;\n","import { hasEndpoint } from './create';\n\nexport function permutations(letters, trie, opts = {\n\ttype: 'anagram',\n}): string[]\n{\n\tif (typeof letters !== 'string')\n\t{\n\t\tthrow new TypeError(`Permutations expects string letters, received ${typeof letters}`);\n\t}\n\n\tconst words = [];\n\n\tconst permute = (word, node, prefix = '') =>\n\t{\n\t\tconst wordIsEmpty = word.length === 0;\n\t\tconst wordFound = words.includes(prefix);\n\t\t//const endWordFound = node[config.END_WORD] === 1;\n\t\tconst endWordFound = hasEndpoint(node);\n\n\t\tif (wordIsEmpty && endWordFound && !wordFound)\n\t\t{\n\t\t\twords.push(prefix);\n\t\t}\n\n\t\tfor (let i = 0, len = word.length; i < len; i++)\n\t\t{\n\t\t\tconst letter = word[i];\n\n\t\t\tif (opts.type === 'sub-anagram')\n\t\t\t{\n\t\t\t\tif (endWordFound && !words.includes(prefix))\n\t\t\t\t{\n\t\t\t\t\twords.push(prefix);\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tif (node[letter])\n\t\t\t{\n\t\t\t\tconst remaining = word.substring(0, i) + word.substring(i + 1, len);\n\t\t\t\t// @ts-ignore\n\t\t\t\tpermute(remaining, node[letter], prefix + letter, words);\n\t\t\t}\n\t\t}\n\n\t\treturn words.sort();\n\t};\n\n\treturn permute(letters, trie);\n}\n\nexport default permutations;\n","import { END_WORD } from '@lazy-trie/types';\nimport { ITrie } from './create';\n\nexport function recurseRandomWord<T>(node: ITrie<T>, prefix: string): string\n{\n\tconst word = prefix;\n\n\tconst branches = Object.keys(node);\n\tconst branch = branches[Math.floor(Math.random() * branches.length)];\n\tif (branch === END_WORD)\n\t{\n\t\treturn word;\n\t}\n\treturn recurseRandomWord(node[branch], prefix + branch);\n}\n\nexport default recurseRandomWord;\n","import { create, ITrie, ITrieNode, ITrieNodeValue, ITrieRaw, isEndpoint, hasEndpoint } from './create';\nimport { append } from './append';\nimport { checkPrefix } from './checkPrefix';\nimport { recursePrefix } from './recursePrefix';\nimport { isString, split, stringify, throwMsg } from '@lazy-trie/util';\nimport { END_DEF, END_VALUE, PERMS_MIN_LEN } from './config';\nimport { END_WORD } from '@lazy-trie/types';\nimport { permutations } from './permutations';\nimport { recurseRandomWord } from './recurseRandomWord';\nimport { IOptions, IOptionsAll, trieToRegExp } from 'trie-regex';\n\nexport { ITrieRaw, ITrieNode, ITrie, ITrieNodeValue, isEndpoint, hasEndpoint };\n\nexport { END_VALUE, END_WORD, END_DEF };\n\nexport const SYM_RAW = Symbol('trie');\n\nexport type IInput<T> = string[];\nexport type IInputMap<T> = [string, T][];\n\nexport type ITrieOptions = {\n\t/**\n\t * @default true\n\t */\n\tignoreCase?: boolean,\n\tmapMode?: boolean,\n};\n\nexport class Trie<T = typeof END_VALUE>\n{\n\t[SYM_RAW]: ITrieRaw<T>;\n\toptions?: Readonly<ITrieOptions>;\n\n\tconstructor(input: IInputMap<T>, options?: ITrieOptions & {\n\t\tmapMode: true,\n\t}, ...argv: any[]);\n\tconstructor(input: IInput<T>, options?: ITrieOptions, ...argv: any[]);\n\tconstructor(input: IInput<T> | IInputMap<T>, options?: ITrieOptions, ...argv: any[])\n\t{\n\t\tif (!Array.isArray(input))\n\t\t{\n\t\t\tthrow throwMsg('parameter Array', typeof input);\n\t\t}\n\n\t\tthis.options = Object.freeze({\n\t\t\tignoreCase: true,\n\t\t\t...this.options,\n\t\t});\n\n\t\tif (this.options.mapMode)\n\t\t{\n\t\t\tthis[SYM_RAW] = create<T>([], ...argv);\n\n\t\t\t(input as IInputMap<T>).forEach((row) =>\n\t\t\t{\n\t\t\t\tconst [key, value] = row;\n\n\t\t\t\tthis.addWord(key, value);\n\t\t\t});\n\t\t}\n\t\telse\n\t\t{\n\t\t\tthis[SYM_RAW] = create<T>([] as IInput<T>, ...argv);\n\n\t\t\t(input as IInput<T>).forEach((key) =>\n\t\t\t{\n\t\t\t\tthis.addWord(key);\n\t\t\t});\n\t\t}\n\t}\n\n\t/**\n\t * Get the generated raw trie object\n\t */\n\ttree()\n\t{\n\t\treturn this[SYM_RAW];\n\t}\n\n\t/**\n\t * Get a string representation of the trie\n\t */\n\tload(obj: ITrieRaw<T>): this;\n\tload<R>(obj: ITrieRaw<R>): this;\n\tload(obj: unknown): this;\n\tload(obj: any)\n\t{\n\t\tthis[SYM_RAW] = obj;\n\n\t\treturn this;\n\t}\n\n\t/**\n\t * Get a string representation of the trie\n\t */\n\tdump(spacer: string | number = 0)\n\t{\n\t\treturn stringify(this[SYM_RAW], spacer);\n\t}\n\n\t/**\n\t * Add a new word to the trie\n\t */\n\taddWord(word: string, value: T = null)\n\t{\n\t\tisString(word, 'word is string');\n\n\t\tconst reducer = (...params: any[]) =>\n\t\t{\n\t\t\t// @ts-ignore\n\t\t\treturn append(...params);\n\t\t};\n\n\t\tconst key = this._key(word);\n\n\t\tconst input = split(key);\n\t\tconst node = input.reduce(reducer, this[SYM_RAW]);\n\n\t\t// @ts-ignore\n\t\tnode[END_WORD] = node[END_WORD] || {};\n\t\tnode[END_WORD][word] = value;\n\t\tnode[END_WORD][END_DEF] = word;\n\n\t\treturn this;\n\t}\n\n\tprotected _key(word: string)\n\t{\n\t\treturn this.options.ignoreCase ? word.toLowerCase() : word;\n\t}\n\n\t/**\n\t * Remove an existing word from the trie\n\t */\n\tremoveWord(word: string, all?: boolean)\n\t{\n\t\tisString(word, 'word is string');\n\n\t\tconst { prefixFound, prefixNode } = this._checkPrefix(word);\n\n\t\tif (prefixFound)\n\t\t{\n\t\t\tconst node = prefixNode[END_WORD];\n\n\t\t\t/**\n\t\t\t * 更改了 removeWord 行為\n\t\t\t * 會先刪除與 word 符合的 key 值\n\t\t\t * 如果沒有則刪除 預設值\n\t\t\t * 基本上這個狀況只會發生在 ignoreCase = true 時\n\t\t\t * 不論如何每次執行都必定刪除一個 key\n\t\t\t */\n\t\t\tif (!all && Object.keys(node).length > 1)\n\t\t\t{\n\t\t\t\tlet bool: boolean;\n\n\t\t\t\tif (word in node)\n\t\t\t\t{\n\t\t\t\t\tdelete node[word];\n\t\t\t\t}\n\t\t\t\telse if (node[END_DEF] in node)\n\t\t\t\t{\n\t\t\t\t\tdelete node[node[END_DEF]];\n\t\t\t\t\tbool = true;\n\t\t\t\t}\n\n\t\t\t\tif (bool || word === node[END_DEF])\n\t\t\t\t{\n\t\t\t\t\tnode[END_DEF] = Object.keys(node)[0];\n\t\t\t\t}\n\t\t\t}\n\t\t\telse\n\t\t\t{\n\t\t\t\tdelete prefixNode[END_WORD];\n\t\t\t}\n\t\t}\n\n\t\treturn this;\n\t}\n\n\tprotected _checkPrefix(prefix: string)\n\t{\n\t\tconst key = this._key(prefix);\n\t\treturn checkPrefix(this[SYM_RAW], key);\n\t}\n\n\t/**\n\t * Check a prefix is valid\n\t * @returns Boolean\n\t */\n\tisPrefix(prefix: string): prefix is string\n\t{\n\t\tisString(prefix, 'prefix is string');\n\n\t\tconst { prefixFound } = this._checkPrefix(prefix);\n\n\t\treturn prefixFound;\n\t}\n\n\t/**\n\t * Get a list of all words in the trie with the given prefix\n\t * @returns Array\n\t */\n\tgetPrefix(strPrefix: string, sorted = true)\n\t{\n\t\tisString(strPrefix, 'prefix is string');\n\n\t\tif (typeof sorted !== 'boolean')\n\t\t{\n\t\t\tthrow throwMsg('sort parameter as boolean', typeof sorted);\n\t\t}\n\n\t\tif (!this.isPrefix(strPrefix))\n\t\t{\n\t\t\treturn [];\n\t\t}\n\n\t\tconst { prefixNode } = this._checkPrefix(strPrefix);\n\n\t\treturn recursePrefix(prefixNode, strPrefix, sorted);\n\t}\n\n\t/**\n\t * Get a random word in the trie with the given prefix\n\t * @returns String\n\t */\n\tgetRandomWordWithPrefix(strPrefix?: string): string;\n\tgetRandomWordWithPrefix(...argv: any[]): string\n\t{\n\t\tlet strPrefix: string;\n\n\t\tif (argv.length)\n\t\t{\n\t\t\tstrPrefix = argv[0];\n\n\t\t\tif (!this.isPrefix(strPrefix))\n\t\t\t{\n\t\t\t\treturn '';\n\t\t\t}\n\t\t}\n\t\telse\n\t\t{\n\t\t\tstrPrefix = '';\n\t\t}\n\n\t\tconst { prefixNode } = this._checkPrefix(strPrefix);\n\n\t\treturn recurseRandomWord(prefixNode, strPrefix);\n\t}\n\n\t/**\n\t * Count the number of words with the given prefixSearch\n\t * @returns Number\n\t */\n\tcountPrefix(strPrefix: string)\n\t{\n\t\tconst prefixes = this.getPrefix(strPrefix);\n\n\t\treturn prefixes.length;\n\t}\n\n\t/**\n\t * Get all words in the trie\n\t * @returns Array\n\t */\n\tgetWordsAll(sorted = true)\n\t{\n\t\tif (typeof sorted !== 'boolean')\n\t\t{\n\t\t\tthrow throwMsg('sort parameter as boolean', typeof sorted);\n\t\t}\n\t\treturn recursePrefix<T>(this[SYM_RAW], '', sorted);\n\t}\n\n\t/**\n\t * Check the existence of a word in the trie\n\t * @returns Boolean\n\t */\n\thasWord(word: string)\n\t{\n\t\tif (typeof word !== 'string')\n\t\t{\n\t\t\tthrow throwMsg('string word', typeof word);\n\t\t}\n\n\t\tif (word !== '')\n\t\t{\n\t\t\tconst { prefixFound, prefixNode } = this._checkPrefix(word);\n\n\t\t\tif (prefixFound)\n\t\t\t{\n\t\t\t\t// @ts-ignore\n\t\t\t\t//return prefixNode[config.END_WORD] === config.END_VALUE;\n\t\t\t\treturn hasEndpoint(prefixNode);\n\t\t\t}\n\t\t}\n\n\t\treturn false;\n\t}\n\n\t/**\n\t *\n\t * @example\n\t * tree.getWordData('object.entries')\n\t * // => { key: 'Object.entries', value: null, matched: false }\n\t * tree.getWordData('Object.entries')\n\t * // { key: 'Object.entries', value: null, matched: true }\n\t */\n\tgetWordData(word: string, notChkDefault?: boolean): {\n\t\tkey: string,\n\t\tvalue: T,\n\t\tmatched: boolean,\n\t};\n\tgetWordData<R>(word: string, notChkDefault?: boolean): {\n\t\tkey: string,\n\t\tvalue: R,\n\t\tmatched: boolean,\n\t};\n\tgetWordData(word: string, notChkDefault?: boolean)\n\t{\n\t\tconst node = this.getWordNode(word);\n\n\t\tif (node)\n\t\t{\n\t\t\tif (word in node)\n\t\t\t{\n\t\t\t\treturn {\n\t\t\t\t\tkey: word,\n\t\t\t\t\tvalue: node[word],\n\t\t\t\t\tmatched: true as const,\n\t\t\t\t};\n\t\t\t}\n\t\t\telse if (!notChkDefault && END_DEF in node)\n\t\t\t{\n\t\t\t\tlet k: string = node[END_DEF];\n\n\t\t\t\tif (!(k in node))\n\t\t\t\t{\n\t\t\t\t\tk = Object.keys(node)[0];\n\t\t\t\t}\n\n\t\t\t\tif (k in node)\n\t\t\t\t{\n\t\t\t\t\treturn {\n\t\t\t\t\t\tkey: k,\n\t\t\t\t\t\tvalue: node[k],\n\t\t\t\t\t\tmatched: k === word,\n\t\t\t\t\t};\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\treturn null;\n\t}\n\n\t/**\n\t * @example\n\t * tree.getWordNode('Object.entries')\n\t * // => { 'Object.entries': null, [Symbol(default)]: 'Object.entries' }\n\t */\n\tgetWordNode(word: string): ITrieNodeValue<T>;\n\tgetWordNode<R>(word: string): ITrieNodeValue<R>;\n\tgetWordNode(word: string): ITrieNodeValue<T>\n\t{\n\t\tif (typeof word !== 'string')\n\t\t{\n\t\t\tthrow throwMsg('string word', typeof word);\n\t\t}\n\n\t\tif (word !== '')\n\t\t{\n\t\t\tconst { prefixFound, prefixNode } = this._checkPrefix(word);\n\n\t\t\tif (hasEndpoint(prefixNode))\n\t\t\t{\n\t\t\t\treturn prefixNode[END_WORD];\n\t\t\t}\n\t\t}\n\n\t\treturn null;\n\t}\n\n\t/**\n\t * @example\n\t * tree.getWordNodeKeys('Object.entries')\n\t * // => [ 'Object.entries' ]\n\t */\n\tgetWordNodeKeys(word: string): string[]\n\t{\n\t\tconst node = this.getWordNode(word);\n\n\t\tif (node)\n\t\t{\n\t\t\treturn Object.keys(node);\n\t\t}\n\n\t\treturn null;\n\t}\n\n\tprotected isAnagrams(letters: string): letters is string\n\t{\n\t\tif (typeof letters !== 'string')\n\t\t{\n\t\t\tthrow throwMsg('string letters', typeof letters);\n\t\t}\n\n\t\tif (letters.length < PERMS_MIN_LEN)\n\t\t{\n\t\t\tthrow throwMsg(`at least ${PERMS_MIN_LEN} letters`, letters.length);\n\t\t}\n\n\t\t// @ts-ignore\n\t\treturn letters;\n\t}\n\n\t/**\n\t * Get a list of valid anagrams that can be made from the given letters\n\t * @returns Array\n\t */\n\tgetAnagrams(letters: string)\n\t{\n\t\tthis.isAnagrams(letters);\n\n\t\treturn permutations(letters, this[SYM_RAW], {\n\t\t\ttype: 'anagram',\n\t\t});\n\t}\n\n\t/**\n\t * Get a list of all sub-anagrams that can be made from the given letters\n\t * @returns Array\n\t */\n\tgetSubAnagrams(letters: string)\n\t{\n\t\tthis.isAnagrams(letters);\n\n\t\treturn permutations(letters, this[SYM_RAW], {\n\t\t\ttype: 'sub-anagram',\n\t\t});\n\t}\n\n\ttoRegExp<R = RegExp>(flags?: string, options?: IOptions): R;\n\ttoRegExp<R>(flags?: string, options?: IOptionsAll<R>): ReturnType<typeof trieToRegExp>;\n\ttoRegExp<R>(flags?, options?)\n\t{\n\t\tif (!flags || !isString(flags))\n\t\t{\n\t\t\tflags = 'u';\n\n\t\t\tif (this.options.ignoreCase)\n\t\t\t{\n\t\t\t\tflags += 'i';\n\t\t\t}\n\t\t}\n\n\t\toptions = Object.assign({\n\t\t\tdisableEscaped: true,\n\t\t\tisEndpoint,\n\n\t\t\tjsescOptions: {\n\t\t\t\t'es6': true,\n\t\t\t\t'minimal': false,\n\t\t\t},\n\n\t\t}, options);\n\n\t\treturn trieToRegExp<R>(this.tree(), flags, options);\n\t}\n\n}\n\nexport function createTrie<T = typeof END_VALUE>(input: IInputMap<T>, options?: ITrieOptions & {\n\tmapMode: true,\n}, ...argv): Trie<T>;\nexport function createTrie<T = typeof END_VALUE>(input: IInput<T>, options?: ITrieOptions, ...argv): Trie<T>;\nexport function createTrie<T = typeof END_VALUE>(...argv)\n{\n\t// @ts-ignore\n\treturn new Trie<T>(...argv);\n}\n\nObject.assign(createTrie, {\n\tprototype: Trie.prototype,\n});\n\n//createTrie.prototype = Trie.prototype;\n\nexport { createTrie as trie };\n\n// @ts-ignore\nif (process.env.TSDX_FORMAT !== 'esm')\n{\n\tObject.defineProperty(createTrie, \"__esModule\", { value: true });\n\n\tObject.defineProperty(createTrie, 'createTrie', { value: createTrie });\n\tObject.defineProperty(createTrie, 'default', { value: createTrie });\n\n\tObject.defineProperty(createTrie, 'trie', { value: createTrie });\n\tObject.defineProperty(createTrie, 'Trie', { value: Trie });\n\n\tObject.defineProperty(createTrie, 'SYM_RAW', { value: SYM_RAW });\n\n\tObject.defineProperty(createTrie, 'END_VALUE', { value: END_VALUE });\n\tObject.defineProperty(createTrie, 'END_WORD', { value: END_WORD });\n\tObject.defineProperty(createTrie, 'END_DEF', { value: END_DEF });\n\n\tObject.defineProperty(createTrie, 'isEndpoint', { value: isEndpoint });\n\tObject.defineProperty(createTrie, 'hasEndpoint', { value: hasEndpoint });\n}\n\nexport default createTrie;\n","import { ITrie, ITrieNode } from './create';\nimport { split } from '@lazy-trie/util';\n\nexport function checkPrefix<T>(prefixNode: ITrie<T>, prefix: string)\n{\n\t//const input = split(prefix.toLowerCase());\n\tconst input = split(prefix);\n\tconst prefixFound = input.every((letter, index): boolean =>\n\t{\n\t\tif (!prefixNode[letter])\n\t\t{\n\t\t\treturn false;\n\t\t}\n\n\t\t// @ts-ignore\n\t\treturn prefixNode = prefixNode[letter];\n\t});\n\n\treturn {\n\t\tprefixFound,\n\t\tprefixNode,\n\t} as {\n\t\tprefixFound: boolean;\n\t\tprefixNode: ITrieNode<T>;\n\t};\n}\n\nexport default checkPrefix;\n"],"names":["append","trie","letter","index","array","length","END_WORD","create","input","argv","Array","isArray","TypeError","reduce","accumulator","item","split","isEndpoint","value","key","hasEndpoint","node","pushInOrder","word","prefixes","i","splice","recursePrefix","prefix","sorted","branch","push","END_VALUE","Object","freeze","END_DEF","Symbol","permutations","letters","opts","type","words","permute","wordIsEmpty","wordFound","includes","endWordFound","len","remaining","substring","sort","recurseRandomWord","branches","keys","Math","floor","random","SYM_RAW","Trie","constructor","options","throwMsg","this","ignoreCase","mapMode","forEach","row","addWord","tree","load","obj","dump","spacer","stringify","isString","_key","params","toLowerCase","removeWord","all","prefixFound","prefixNode","_checkPrefix","bool","checkPrefix","every","isPrefix","getPrefix","strPrefix","getRandomWordWithPrefix","countPrefix","getWordsAll","hasWord","getWordData","notChkDefault","getWordNode","matched","k","getWordNodeKeys","isAnagrams","getAnagrams","getSubAnagrams","toRegExp","flags","assign","disableEscaped","jsescOptions","es6","minimal","trieToRegExp","createTrie","prototype","defineProperty"],"mappings":"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"}