ORSet<T>.fromMap constructor
ORSet<T>.fromMap(
- Map<String, dynamic> map,
- T decoder(
- dynamic
)
)
Implementation
factory ORSet.fromMap(Map<String, dynamic> map, T Function(dynamic) decoder) {
// Format 2 stores entries as {'e': encodedElement, 't': [tags]} so the
// element round-trips through [decoder] faithfully. The legacy format
// stringified elements into JSON map KEYS — `toString()` has no inverse,
// so any non-String element type either crashed the decoder or collided
// distinct elements into one key (merging their tag sets).
if (map['format'] == 2) {
Map<T, Set<String>> parse(String key) => {
for (final raw in (map[key] as List? ?? const [])) decoder((raw as Map)['e']): ((raw['t'] as List?) ?? const []).cast<String>().toSet(),
};
return ORSet(addSet: parse('add'), removeSet: parse('remove'));
}
final addMap = <T, Set<String>>{};
(map['add'] as Map<String, dynamic>?)?.forEach((k, v) {
addMap[decoder(k)] = (v as List).cast<String>().toSet();
});
final removeMap = <T, Set<String>>{};
(map['remove'] as Map<String, dynamic>?)?.forEach((k, v) {
removeMap[decoder(k)] = (v as List).cast<String>().toSet();
});
return ORSet(addSet: addMap, removeSet: removeMap);
}