UnitSymbol.parse constructor

UnitSymbol.parse(
  1. 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);
}