UNPKG

@palasimi/ipa-cluster

Version:

Cluster words with similar IPA transcriptions together

61 lines 1.77 kB
"use strict"; // SPDX-License-Identifier: GPL-3.0-or-later // Copyright (c) 2023 Levi Gruspe // Expanded intermediate representations. Object.defineProperty(exports, "__esModule", { value: true }); exports.expand = void 0; const operators_1 = require("./operators"); /** * Cleans up a sequence of sounds by getting rid of invalid word boundaries. * Specifically, middle "#"s and duplicate "#"s are deleted. */ function clean(sequence) { if (sequence.length === 0) { return sequence; } const result = [sequence[0]]; for (let i = 1; i < sequence.length; i++) { const sound = sequence[i]; if (sound === "#") { continue; } result.push(sound); } if (result.at(-1) !== "#" && sequence.at(-1) === "#") { result.push("#"); } return result; } /** * Expands rules with unions of sounds into a collection of rules. * For example, `{a b c} ~ {x y}` becomes: * ``` * a ~ x * a ~ y * b ~ x * b ~ y * c ~ x * c ~ y * ``` * * Also removes invalid word boundaries (middle "#" and duplicate "#"). */ function expand(ir) { const expandedRules = []; for (const { constraint, left, right } of ir.rules) { const leftSequences = (0, operators_1.concatenate)(...left).map(clean); const rightSequences = (0, operators_1.concatenate)(...right).map(clean); for (const leftSequence of leftSequences) { for (const rightSequence of rightSequences) { expandedRules.push({ constraint, left: leftSequence, right: rightSequence, }); } } } return { rules: expandedRules }; } exports.expand = expand; //# sourceMappingURL=expand.js.map