UNPKG

nhb-toolbox

Version:

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

43 lines (42 loc) 1.55 kB
"use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports.generateAnagrams = generateAnagrams; const non_primitives_1 = require("../guards/non-primitives"); const primitives_1 = require("../guards/primitives"); 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; } function generateAnagrams(word, options) { if (!(0, primitives_1.isNonEmptyString)(word)) return []; if (word?.length === 1) return [word?.toLowerCase()]; const { limit = 100, dictionary = false } = options || {}; const outSet = new Set(); const dictSet = (0, non_primitives_1.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]; }