interpolateString function

Interpolator<String> interpolateString(
  1. String a,
  2. String b
)

Creates a string interpolator that interpolates numbers within strings.

Implementation

Interpolator<String> interpolateString(String a, String b) {
  // Find numeric parts in the strings
  final numPattern = RegExp(r'[-+]?(?:\d+\.?\d*|\.\d+)(?:[eE][-+]?\d+)?');

  final aMatches = numPattern.allMatches(a).toList();
  final bMatches = numPattern.allMatches(b).toList();

  if (aMatches.isEmpty || bMatches.isEmpty) {
    return (double t) => t < 0.5 ? a : b;
  }

  // Extract numbers and create interpolators
  final aNumbers = aMatches.map((m) => double.parse(m.group(0)!)).toList();
  final bNumbers = bMatches.map((m) => double.parse(m.group(0)!)).toList();

  final n = math.min(aNumbers.length, bNumbers.length);
  final interpolators = <Interpolator<double>>[];

  for (int i = 0; i < n; i++) {
    interpolators.add(interpolateDouble(aNumbers[i], bNumbers[i]));
  }

  // Get the template from b
  final parts = <String>[];
  int lastEnd = 0;
  for (final match in bMatches.take(n)) {
    parts.add(b.substring(lastEnd, match.start));
    lastEnd = match.end;
  }
  parts.add(b.substring(lastEnd));

  return (double t) {
    final buffer = StringBuffer();
    for (int i = 0; i < n; i++) {
      buffer.write(parts[i]);
      buffer.write(interpolators[i](t));
    }
    buffer.write(parts.last);
    return buffer.toString();
  };
}