decode method

List<int> decode(
  1. List<int> codes
)

Implementation

List<int> decode(List<int> codes) {
  final dict = <int, List<int>>{};
  for (var i = 0; i < 256; i++) {
    dict[i] = [i];
  }
  var code = 256;
  var prev = <int>[];
  final out = <int>[];
  for (var k in codes) {
    List<int> entry;
    if (dict.containsKey(k)) {
      entry = dict[k]!;
    } else if (k == code) {
      entry = List<int>.from(prev)..add(prev.first);
    } else {
      throw StateError('Bad LZW code');
    }
    out.addAll(entry);
    if (prev.isNotEmpty) {
      dict[code++] = List<int>.from(prev)..add(entry.first);
    }
    prev = entry;
  }
  return out;
}