interpolateString function
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();
};
}