map<K, V, InputK, InputV> static method

BcsType<Map<K, V>, Map<InputK, InputV>> map<K, V, InputK, InputV>(
  1. BcsType<K, InputK> keyType,
  2. BcsType<V, InputV> valueType
)

Implementation

static BcsType<Map<K, V>, Map<InputK, InputV>> map<K, V, InputK, InputV>(
    BcsType<K, InputK> keyType, BcsType<V, InputV> valueType) {
  return BcsType<Map<K, V>, Map<InputK, InputV>>(
    name: 'Map<${keyType.name}, ${valueType.name}>',
    read: (reader) {
      final length = reader.readULEB();
      final result = <K, V>{};
      for (var i = 0; i < length; i++) {
        final k = keyType.read(reader);
        final v = valueType.read(reader);
        result[k] = v;
      }
      return result;
    },
    write: (value, writer) {
      // Sort entries by serialized key bytes for canonical map order.
      final entries = value.entries
          .map((e) => [keyType.serialize(e.key).toBytes(), e.value])
          .toList();
      entries.sort(
          (a, b) => compareBcsBytes(a[0] as Uint8List, b[0] as Uint8List));
      writer.writeULEB(entries.length);
      for (final entry in entries) {
        writer.writeBytes(entry[0] as Uint8List);
        valueType.write(entry[1] as InputV, writer);
      }
    },
  );
}