mergeExpressionStyles function

ExpressionStyle mergeExpressionStyles(
  1. List<ExpressionStyle> styles
)

Merge expression styles from multiple policies (ยง7.4).

Implementation

ExpressionStyle mergeExpressionStyles(List<ExpressionStyle> styles) {
  if (styles.isEmpty) return ExpressionStyle.defaultStyle;
  if (styles.length == 1) return styles.first;

  // Merge tone: use most extreme/cautious values
  final mergedTone = ToneConfig(
    formality: _mostFormal(styles.map((s) => s.tone.formality)),
    confidence: _leastConfident(styles.map((s) => s.tone.confidence)),
    empathy: _highest(styles.map((s) => s.tone.empathy)),
    directness: _average(styles.map((s) => s.tone.directness)),
  );

  // Merge format: use most restrictive
  final mergedFormat = FormatConfig(
    structure: styles.first.format.structure,
    length: _shortest(styles.map((s) => s.format.length)),
    includeEvidence: styles.any((s) => s.format.includeEvidence),
    includeCaveats: styles.any((s) => s.format.includeCaveats),
    includeAlternatives: styles.any((s) => s.format.includeAlternatives),
  );

  // Merge hedging: use highest level, merge phrases by category
  final mergedPhrases = <String, List<String>>{};
  for (final style in styles) {
    final phrases = style.hedging?.phrases;
    if (phrases != null) {
      _mergePhrasesInto(mergedPhrases, phrases.highUncertainty, 'high_uncertainty');
      _mergePhrasesInto(mergedPhrases, phrases.moderateUncertainty, 'moderate_uncertainty');
      _mergePhrasesInto(mergedPhrases, phrases.lowUncertainty, 'low_uncertainty');
      _mergePhrasesInto(mergedPhrases, phrases.qualifying, 'qualifying');
      _mergePhrasesInto(mergedPhrases, phrases.probabilistic, 'probabilistic');
    }
  }

  final mergedHedging = HedgingConfig(
    level: _highestHedging(
        styles.map((s) => s.hedging?.level ?? HedgingLevel.none)),
    phrases: mergedPhrases.isNotEmpty
        ? HedgingPhrases(
            highUncertainty: mergedPhrases['high_uncertainty'],
            moderateUncertainty: mergedPhrases['moderate_uncertainty'],
            lowUncertainty: mergedPhrases['low_uncertainty'],
            qualifying: mergedPhrases['qualifying'],
            probabilistic: mergedPhrases['probabilistic'],
          )
        : null,
  );

  return ExpressionStyle(
    tone: mergedTone,
    format: mergedFormat,
    hedging: mergedHedging,
  );
}