| 1 |  |  | import 'package:meta/meta.dart'; | 
                
                
                    | 2 |  |  |  | 
                
                
                    | 3 |  |  | import '../typedefs.dart'; | 
                
                
                    | 4 |  |  |  | 
                
                
                    | 5 |  |  | /// Wraps a `Map<dynamic, dynamic>` and a `Cast<V>` converter. Keys in the map | 
                
                
                    | 6 |  |  | /// must be castable to [K] (`key as K`). Values in the map are converted to [V] | 
                
                
                    | 7 |  |  | /// on demand i.e. when they are read by the program. Conversion occurs only | 
                
                
                    | 8 |  |  | /// once for each value and the original `dynamic` value is replaced with the | 
                
                
                    | 9 |  |  | /// conversion result. If some keys cannot be safely cast to [K], exceptions | 
                
                
                    | 10 |  |  | /// might occur at runtime, e.g. when reading [keys] or [entries], or calling | 
                
                
                    | 11 |  |  | /// [map]. | 
                
                
                    | 12 |  |  | @internal | 
                
                
                    | 13 |  |  | class LazyInPlaceMap<K, V> implements Map<K, V> { | 
                
                
                    | 14 |  | 1 |   LazyInPlaceMap(this._data, this._vcast); | 
                
                
                    | 15 |  |  |  | 
                
                
                    | 16 |  |  |   final Map<dynamic, dynamic> _data; | 
                
                
                    | 17 |  |  |   final Cast<V> _vcast; | 
                
                
                    | 18 |  |  |  | 
                
                
                    | 19 |  | 1 |   @override | 
                
                
                    | 20 |  |  |   Iterable<MapEntry<K, V>> get entries => | 
                
                
                    | 21 |  | 5 |       keys.map((k) => MapEntry(k, _get(k) as V)); | 
                
                
                    | 22 |  |  |  | 
                
                
                    | 23 |  | 1 |   @override | 
                
                
                    | 24 |  | 2 |   bool get isEmpty => _data.isEmpty; | 
                
                
                    | 25 |  |  |  | 
                
                
                    | 26 |  | 1 |   @override | 
                
                
                    | 27 |  | 2 |   bool get isNotEmpty => _data.isNotEmpty; | 
                
                
                    | 28 |  |  |  | 
                
                
                    | 29 |  | 1 |   @override | 
                
                
                    | 30 |  | 3 |   Iterable<K> get keys => _data.keys.cast<K>(); | 
                
                
                    | 31 |  |  |  | 
                
                
                    | 32 |  | 1 |   @override | 
                
                
                    | 33 |  | 2 |   int get length => _data.length; | 
                
                
                    | 34 |  |  |  | 
                
                
                    | 35 |  | 1 |   @override | 
                
                
                    | 36 |  | 5 |   Iterable<V> get values => _data.keys.map((k) => _get(k) as V); | 
                
                
                    | 37 |  |  |  | 
                
                
                    | 38 |  | 1 |   @override | 
                
                
                    | 39 |  | 1 |   V? operator [](Object? key) => _get(key); | 
                
                
                    | 40 |  |  |  | 
                
                
                    | 41 |  | 1 |   @override | 
                
                
                    | 42 |  | 2 |   void operator []=(K key, V value) => _data[key] = value; | 
                
                
                    | 43 |  |  |  | 
                
                
                    | 44 |  | 1 |   @override | 
                
                
                    | 45 |  | 2 |   void addAll(Map<K, V> other) => _data.addAll(other); | 
                
                
                    | 46 |  |  |  | 
                
                
                    | 47 |  | 1 |   @override | 
                
                
                    | 48 |  |  |   void addEntries(Iterable<MapEntry<K, V>> newEntries) => | 
                
                
                    | 49 |  | 2 |       _data.addEntries(newEntries); | 
                
                
                    | 50 |  |  |  | 
                
                
                    | 51 |  | 1 |   @override | 
                
                
                    | 52 |  | 2 |   Map<RK, RV> cast<RK, RV>() => _forceCast().cast<RK, RV>(); | 
                
                
                    | 53 |  |  |  | 
                
                
                    | 54 |  | 1 |   @override | 
                
                
                    | 55 |  | 2 |   void clear() => _data.clear(); | 
                
                
                    | 56 |  |  |  | 
                
                
                    | 57 |  | 1 |   @override | 
                
                
                    | 58 |  | 2 |   bool containsKey(Object? key) => _data.containsKey(key); | 
                
                
                    | 59 |  |  |  | 
                
                
                    | 60 |  | 1 |   @override | 
                
                
                    | 61 |  | 6 |   bool containsValue(Object? value) => _data.keys.any((k) => value == _get(k)); | 
                
                
                    | 62 |  |  |  | 
                
                
                    | 63 |  | 1 |   @override | 
                
                
                    | 64 |  |  |   void forEach(void Function(K key, V value) action) { | 
                
                
                    | 65 |  | 3 |     for (var k in _data.keys) { | 
                
                
                    | 66 |  | 2 |       action(k as K, _get(k) as V); | 
                
                
                    | 67 |  |  |     } | 
                
                
                    | 68 |  |  |   } | 
                
                
                    | 69 |  |  |  | 
                
                
                    | 70 |  | 1 |   @override | 
                
                
                    | 71 |  |  |   Map<K2, V2> map<K2, V2>(MapEntry<K2, V2> Function(K key, V value) convert) { | 
                
                
                    | 72 |  | 4 |     final r = <K2, V2>{}, keys = _data.keys.toList(); | 
                
                
                    | 73 |  | 4 |     for (var i = keys.length - 1; i >= 0; i--) { | 
                
                
                    | 74 |  | 3 |       final k = keys[i], e = convert(k as K, _get(k) as V); | 
                
                
                    | 75 |  | 3 |       r[e.key] = e.value; | 
                
                
                    | 76 |  |  |     } | 
                
                
                    | 77 |  |  |     return r; | 
                
                
                    | 78 |  |  |   } | 
                
                
                    | 79 |  |  |  | 
                
                
                    | 80 |  | 1 |   @override | 
                
                
                    | 81 |  |  |   V putIfAbsent(K key, V Function() ifAbsent) => | 
                
                
                    | 82 |  | 2 |       _data.putIfAbsent(key, ifAbsent); | 
                
                
                    | 83 |  |  |  | 
                
                
                    | 84 |  | 1 |   @override | 
                
                
                    | 85 |  | 2 |   V? remove(Object? key) => _data.remove(key); | 
                
                
                    | 86 |  |  |  | 
                
                
                    | 87 |  | 1 |   @override | 
                
                
                    | 88 |  |  |   void removeWhere(bool Function(K key, V value) test) { | 
                
                
                    | 89 |  | 3 |     final keys = _data.keys.toList(); | 
                
                
                    | 90 |  | 4 |     for (var i = keys.length - 1; i >= 0; i--) { | 
                
                
                    | 91 |  | 2 |       final k = keys[i], v = _get(k); | 
                
                
                    | 92 |  | 1 |       if (test(k as K, v as V)) { | 
                
                
                    | 93 |  | 2 |         _data.remove(k); | 
                
                
                    | 94 |  |  |       } | 
                
                
                    | 95 |  |  |     } | 
                
                
                    | 96 |  |  |   } | 
                
                
                    | 97 |  |  |  | 
                
                
                    | 98 |  | 1 |   @override | 
                
                
                    | 99 |  |  |   String toString() { | 
                
                
                    | 100 |  | 1 |     _forceCast(); | 
                
                
                    | 101 |  | 2 |     return _data.toString(); | 
                
                
                    | 102 |  |  |   } | 
                
                
                    | 103 |  |  |  | 
                
                
                    | 104 |  | 1 |   @override | 
                
                
                    | 105 |  |  |   V update(K key, V Function(V value) update, {V Function()? ifAbsent}) => | 
                
                
                    | 106 |  | 4 |       _data.update(key, (v) => (v != null && v is! V) ? _vcast(v) : v, | 
                
                
                    | 107 |  |  |           ifAbsent: ifAbsent); | 
                
                
                    | 108 |  |  |  | 
                
                
                    | 109 |  | 1 |   @override | 
                
                
                    | 110 |  |  |   void updateAll(V Function(K key, V value) update) { | 
                
                
                    | 111 |  | 3 |     final keys = _data.keys.toList(); | 
                
                
                    | 112 |  | 4 |     for (var i = keys.length - 1; i >= 0; i--) { | 
                
                
                    | 113 |  | 2 |       final k = keys[i], v = _get(k); | 
                
                
                    | 114 |  | 3 |       _data[k] = update(k as K, v as V); | 
                
                
                    | 115 |  |  |     } | 
                
                
                    | 116 |  |  |   } | 
                
                
                    | 117 |  |  |  | 
                
                
                    | 118 |  | 1 |   Map<dynamic, dynamic> _forceCast() { | 
                
                
                    | 119 |  | 3 |     var keys = _data.keys.toList(); | 
                
                
                    | 120 |  | 4 |     for (var i = keys.length - 1; i >= 0; i--) { | 
                
                
                    | 121 |  | 2 |       _get(keys[i]); | 
                
                
                    | 122 |  |  |     } | 
                
                
                    | 123 |  | 1 |     return _data; | 
                
                
                    | 124 |  |  |   } | 
                
                
                    | 125 |  |  |  | 
                
                
                    | 126 |  | 1 |   V? _get(Object? key) { | 
                
                
                    | 127 |  | 2 |     dynamic v = _data[key]; | 
                
                
                    | 128 |  | 1 |     if (v != null && v is! V) { | 
                
                
                    | 129 |  | 2 |       v = _vcast(v); | 
                
                
                    | 130 |  | 2 |       _data[key] = v; | 
                
                
                    | 131 |  |  |     } | 
                
                
                    | 132 |  |  |     return v; | 
                
                
                    | 133 |  |  |   } | 
                
                
                    | 134 |  |  | } |