UNPKG

nhb-toolbox

Version:

A versatile collection of smart, efficient, and reusable utility functions, classes and types for everyday development needs.

40 lines (39 loc) 1.4 kB
import { isValidArray } from '../guards/non-primitives.js'; import { isNonEmptyString } from '../guards/primitives.js'; const DICT_CACHE = new WeakMap(); function _getDictSet(dict) { if (DICT_CACHE.has(dict)) return DICT_CACHE.get(dict); const dictSet = new Set(dict.map((w) => w.toLowerCase())); DICT_CACHE.set(dict, dictSet); return dictSet; } export function generateAnagrams(word, options) { if (!isNonEmptyString(word)) return []; if (word?.length === 1) return [word?.toLowerCase()]; const { limit = 100, dictionary = false } = options || {}; const outSet = new Set(); const dictSet = isValidArray(dictionary) ? _getDictSet(dictionary) : undefined; const _permute = (current, remaining) => { if (!remaining.length) { if (!dictSet || dictSet.has(current)) { outSet.add(current); } return; } const usedSet = new Set(); for (let i = 0; i < remaining.length; i++) { const char = remaining[i]; if (usedSet.has(char)) continue; usedSet.add(char); if (limit !== 'all' && outSet.size >= limit) return; _permute(current + char, remaining.slice(0, i) + remaining.slice(i + 1)); } }; _permute('', word.toLowerCase()); return [...outSet]; }