@palasimi/ipa-cluster
Version:
Cluster words with similar IPA transcriptions together
61 lines • 1.77 kB
JavaScript
;
// 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