| Index: packages/collection/lib/src/canonicalized_map.dart
|
| diff --git a/packages/collection/lib/src/canonicalized_map.dart b/packages/collection/lib/src/canonicalized_map.dart
|
| index 7ee3f86c4c717ae4f7c38c72fdf789d19ee926ea..a8af43a0a854b3a313b9d996a8018e69b6e52ef6 100644
|
| --- a/packages/collection/lib/src/canonicalized_map.dart
|
| +++ b/packages/collection/lib/src/canonicalized_map.dart
|
| @@ -2,56 +2,53 @@
|
| // for details. All rights reserved. Use of this source code is governed by a
|
| // BSD-style license that can be found in the LICENSE file.
|
|
|
| -library dart.pkg.collection.canonicalized_map;
|
| -
|
| import 'dart:collection';
|
|
|
| import 'utils.dart';
|
|
|
| -/**
|
| - * A map whose keys are converted to canonical values of type `C`.
|
| - *
|
| - * This is useful for using case-insensitive String keys, for example. It's more
|
| - * efficient than a [LinkedHashMap] with a custom equality operator because it
|
| - * only canonicalizes each key once, rather than doing so for each comparison.
|
| - *
|
| - * By default, `null` is allowed as a key. It can be forbidden via the
|
| - * `isValidKey` parameter.
|
| - */
|
| +typedef C _Canonicalize<C, K>(K key);
|
| +
|
| +typedef bool _IsValidKey(Object key);
|
| +
|
| +/// A map whose keys are converted to canonical values of type `C`.
|
| +///
|
| +/// This is useful for using case-insensitive String keys, for example. It's
|
| +/// more efficient than a [LinkedHashMap] with a custom equality operator
|
| +/// because it only canonicalizes each key once, rather than doing so for each
|
| +/// comparison.
|
| +///
|
| +/// By default, `null` is allowed as a key. It can be forbidden via the
|
| +/// `isValidKey` parameter.
|
| class CanonicalizedMap<C, K, V> implements Map<K, V> {
|
| - final Function _canonicalize;
|
| + final _Canonicalize<C, K> _canonicalize;
|
|
|
| - final Function _isValidKeyFn;
|
| + final _IsValidKey _isValidKeyFn;
|
|
|
| final _base = new Map<C, Pair<K, V>>();
|
|
|
| - /**
|
| - * Creates an empty canonicalized map.
|
| - *
|
| - * The [canonicalize] function should return the canonical value for the given
|
| - * key. Keys with the same canonical value are considered equivalent.
|
| - *
|
| - * The [isValidKey] function is called before calling [canonicalize] for
|
| - * methods that take arbitrary objects. It can be used to filter out keys that
|
| - * can't be canonicalized.
|
| - */
|
| + /// Creates an empty canonicalized map.
|
| + ///
|
| + /// The [canonicalize] function should return the canonical value for the
|
| + /// given key. Keys with the same canonical value are considered equivalent.
|
| + ///
|
| + /// The [isValidKey] function is called before calling [canonicalize] for
|
| + /// methods that take arbitrary objects. It can be used to filter out keys
|
| + /// that can't be canonicalized.
|
| CanonicalizedMap(C canonicalize(K key), {bool isValidKey(Object key)})
|
| : _canonicalize = canonicalize,
|
| _isValidKeyFn = isValidKey;
|
|
|
| - /**
|
| - * Creates a canonicalized map that is initialized with the key/value pairs of
|
| - * [other].
|
| - *
|
| - * The [canonicalize] function should return the canonical value for the given
|
| - * key. Keys with the same canonical value are considered equivalent.
|
| - *
|
| - * The [isValidKey] function is called before calling [canonicalize] for
|
| - * methods that take arbitrary objects. It can be used to filter out keys that
|
| - * can't be canonicalized.
|
| - */
|
| + /// Creates a canonicalized map that is initialized with the key/value pairs
|
| + /// of [other].
|
| + ///
|
| + /// The [canonicalize] function should return the canonical value for the
|
| + /// given key. Keys with the same canonical value are considered equivalent.
|
| + ///
|
| + /// The [isValidKey] function is called before calling [canonicalize] for
|
| + /// methods that take arbitrary objects. It can be used to filter out keys
|
| + /// that can't be canonicalized.
|
| CanonicalizedMap.from(Map<K, V> other, C canonicalize(K key),
|
| - {bool isValidKey(Object key)})
|
| + {bool isValidKey(Object key)})
|
| : _canonicalize = canonicalize,
|
| _isValidKeyFn = isValidKey {
|
| addAll(other);
|
| @@ -59,11 +56,12 @@ class CanonicalizedMap<C, K, V> implements Map<K, V> {
|
|
|
| V operator [](Object key) {
|
| if (!_isValidKey(key)) return null;
|
| - var pair = _base[_canonicalize(key)];
|
| + var pair = _base[_canonicalize(key as K)];
|
| return pair == null ? null : pair.last;
|
| }
|
|
|
| void operator []=(K key, V value) {
|
| + if (!_isValidKey(key)) return;
|
| _base[_canonicalize(key)] = new Pair(key, value);
|
| }
|
|
|
| @@ -77,7 +75,7 @@ class CanonicalizedMap<C, K, V> implements Map<K, V> {
|
|
|
| bool containsKey(Object key) {
|
| if (!_isValidKey(key)) return false;
|
| - return _base.containsKey(_canonicalize(key));
|
| + return _base.containsKey(_canonicalize(key as K));
|
| }
|
|
|
| bool containsValue(Object value) =>
|
| @@ -96,13 +94,14 @@ class CanonicalizedMap<C, K, V> implements Map<K, V> {
|
| int get length => _base.length;
|
|
|
| V putIfAbsent(K key, V ifAbsent()) {
|
| - return _base.putIfAbsent(_canonicalize(key),
|
| - () => new Pair(key, ifAbsent())).last;
|
| + return _base
|
| + .putIfAbsent(_canonicalize(key), () => new Pair(key, ifAbsent()))
|
| + .last;
|
| }
|
|
|
| V remove(Object key) {
|
| if (!_isValidKey(key)) return null;
|
| - var pair = _base.remove(_canonicalize(key));
|
| + var pair = _base.remove(_canonicalize(key as K));
|
| return pair == null ? null : pair.last;
|
| }
|
|
|
| @@ -110,6 +109,7 @@ class CanonicalizedMap<C, K, V> implements Map<K, V> {
|
|
|
| String toString() => Maps.mapToString(this);
|
|
|
| - bool _isValidKey(Object key) => (key == null || key is K) &&
|
| + bool _isValidKey(Object key) =>
|
| + (key == null || key is K) &&
|
| (_isValidKeyFn == null || _isValidKeyFn(key));
|
| }
|
|
|