UnitSymbol.parse constructor
UnitSymbol.parse(
- String source
Implementation
factory UnitSymbol.parse(String source) {
final terms = <String, int>{};
var isDenominator = false;
final buffer = StringBuffer();
void commit() {
final raw = buffer.toString().trim();
buffer.clear();
if (raw.isEmpty) return;
final match = RegExp(r'^(.+?)(?:\^(-?\d+))?$').firstMatch(raw);
if (match == null) return;
final token = match.group(1)!.trim();
final exp = int.tryParse(match.group(2) ?? '1') ?? 1;
final signedExp = isDenominator ? -exp : exp;
terms.update(token, (value) => value + signedExp, ifAbsent: () => signedExp);
}
for (final rune in source.runes) {
final char = String.fromCharCode(rune);
if (char == '*' || char == '/') {
commit();
if (char == '/') isDenominator = true;
continue;
}
buffer.write(char);
}
commit();
return UnitSymbol._(terms);
}