Index: quiver/lib/src/collection/bimap.dart |
diff --git a/quiver/lib/src/collection/bimap.dart b/quiver/lib/src/collection/bimap.dart |
deleted file mode 100644 |
index 0757aa5a7b4fa6c352cfaa3e73ee413e8bd31e10..0000000000000000000000000000000000000000 |
--- a/quiver/lib/src/collection/bimap.dart |
+++ /dev/null |
@@ -1,121 +0,0 @@ |
-// Copyright 2013 Google Inc. All Rights Reserved. |
-// |
-// Licensed under the Apache License, Version 2.0 (the "License"); |
-// you may not use this file except in compliance with the License. |
-// You may obtain a copy of the License at |
-// |
-// http://www.apache.org/licenses/LICENSE-2.0 |
-// |
-// Unless required by applicable law or agreed to in writing, software |
-// distributed under the License is distributed on an "AS IS" BASIS, |
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
-// See the License for the specific language governing permissions and |
-// limitations under the License. |
- |
-part of quiver.collection; |
- |
-/** |
- * A bi-directional map whose key-value pairs form a one-to-one correspondence. |
- * BiMaps support an `inverse` property which gives access to an inverted view |
- * of the map, such that there is a mapping (v, k) for each pair (k, v) in the |
- * original map. Since a one-to-one key-value invariant applies, it is an error |
- * to insert duplicate values into this map. It is also an error to insert null |
- * keys or values into this map. |
- */ |
-abstract class BiMap<K, V> implements Map<K, V> { |
- /** |
- * Creates a BiMap instance with the default implementation. |
- */ |
- factory BiMap() => new HashBiMap(); |
- |
- /** |
- * Adds an association between key and value. |
- * |
- * Throws [ArgumentError] if an association involving [value] exists in the |
- * map; otherwise, the association is inserted, overwriting any existing |
- * association for the key. |
- */ |
- void operator []=(K key, V value); |
- |
- /** |
- * Replaces any existing associations(s) involving key and value. |
- * |
- * If an association involving [key] or [value] exists in the map, it is |
- * removed. |
- */ |
- void replace(K key, V value); |
- |
- /** |
- * Returns the inverse of this map, with key-value pairs (v, k) for each |
- * pair (k, v) in this map. |
- */ |
- BiMap<V, K> get inverse; |
-} |
- |
-/** |
- * A hash-table based implementation of BiMap. |
- */ |
-class HashBiMap<K, V> implements BiMap<K, V> { |
- final Map<K, V> _map; |
- final Map<V, K> _inverse; |
- BiMap<V, K> _cached; |
- |
- HashBiMap() : this._from(new HashMap(), new HashMap()); |
- HashBiMap._from(this._map, this._inverse); |
- |
- V operator [](Object key) => _map[key]; |
- void operator []=(K key, V value) { |
- _add(key, value, false); |
- } |
- void replace(K key, V value) { |
- _add(key, value, true); |
- } |
- void addAll(Map<K, V> other) => other.forEach((k, v) => _add(k, v, false)); |
- bool containsKey(Object key) => _map.containsKey(key); |
- bool containsValue(Object value) => _inverse.containsKey(value); |
- void forEach(void f(K key, V value)) => _map.forEach(f); |
- bool get isEmpty => _map.isEmpty; |
- bool get isNotEmpty => _map.isNotEmpty; |
- Iterable<K> get keys => _map.keys; |
- int get length => _map.length; |
- Iterable<V> get values => _inverse.keys; |
- |
- BiMap<V, K> get inverse { |
- if (_cached == null) { |
- _cached = new HashBiMap._from(_inverse, _map); |
- } |
- return _cached; |
- } |
- |
- V putIfAbsent(K key, V ifAbsent()) { |
- var value = _map[key]; |
- if (value != null) return value; |
- if (!_map.containsKey(key)) return _add(key, ifAbsent(), false); |
- return null; |
- } |
- |
- V remove(Object key) { |
- _inverse.remove(_map[key]); |
- return _map.remove(key); |
- } |
- |
- void clear() { |
- _map.clear(); |
- _inverse.clear(); |
- } |
- |
- V _add(K key, V value, bool replace) { |
- if (key == null) throw new ArgumentError("null key"); |
- if (value == null) throw new ArgumentError("null value"); |
- var oldValue = _map[key]; |
- if (oldValue == value) return value; |
- if (_inverse.containsKey(value)) { |
- if (!replace) throw new ArgumentError("Mapping for $value exists"); |
- _map.remove(_inverse[value]); |
- } |
- _inverse.remove(oldValue); |
- _map[key] = value; |
- _inverse[value] = key; |
- return value; |
- } |
-} |