SymbolTable constructor

SymbolTable({
  1. String? symbolsString,
  2. List<String>? symbolsArray,
  3. Map<String, int>? symbolsMap,
})

Implementation

SymbolTable({
  String? symbolsString,
  List<String>? symbolsArray,
  Map<String, int>? symbolsMap,
}) {
  // Condition the input `symbolsArr`
  if (symbolsArray != null) {
    num2sym = symbolsArray;
  } else {
    if (symbolsString != null && symbolsString.isNotEmpty) {
      num2sym = symbolsString.split('');
    } else {
      throw Exception('symbolsArr and symbolsStr must not be null or empty');
    }
  }

  // Condition the second input, `symbolsMap`. If no symbolsMap passed in,
  // make it by inverting symbolsArr. If it's an object (and not a Map),
  // convert its own-properties to a Map.
  if (symbolsMap != null) {
    sym2num = symbolsMap;
  } else {
    sym2num = HashMap();
    // for (var i = 0; i < num2sym.length; i++) {
    //   sym2num.putIfAbsent(num2sym[i], () => i);
    // }
    sym2num = HashMap.fromIterable(num2sym,
        key: (element) => element as String,
        value: (element) => num2sym.indexOf(element as String));
  }

  // `symbolsMap`
  var symbolsValuesSet = Set.of(sym2num.values);
  for (var i = 0; i < num2sym.length; i++) {
    if (!symbolsValuesSet.contains(i)) {
      throw Exception(
          '${num2sym.length} symbols given but $i not found in symbol table');
    }
  }

  maxBase = num2sym.length;
  _isPrefixCode = isPrefixCode(num2sym);
}