Index: mojo/public/dart/third_party/shelf/lib/src/shelf_unmodifiable_map.dart |
diff --git a/mojo/public/dart/third_party/shelf/lib/src/shelf_unmodifiable_map.dart b/mojo/public/dart/third_party/shelf/lib/src/shelf_unmodifiable_map.dart |
new file mode 100644 |
index 0000000000000000000000000000000000000000..d07ebfd59635248f2e1dc74623d3daeb3d7174cc |
--- /dev/null |
+++ b/mojo/public/dart/third_party/shelf/lib/src/shelf_unmodifiable_map.dart |
@@ -0,0 +1,52 @@ |
+// Copyright (c) 2014, the Dart project authors. Please see the AUTHORS file |
+// 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 shelf.shelf_unmodifiable_map; |
+ |
+import 'dart:collection'; |
+ |
+import 'package:collection/wrappers.dart' as pc; |
+ |
+/// A simple wrapper over [pc.UnmodifiableMapView] which avoids re-wrapping |
+/// itself. |
+class ShelfUnmodifiableMap<V> extends UnmodifiableMapView<String, V> { |
+ /// If [source] is a [ShelfUnmodifiableMap] with matching [ignoreKeyCase], |
+ /// then [source] is returned. |
+ /// |
+ /// If [source] is `null` it is treated like an empty map. |
+ /// |
+ /// If [ignoreKeyCase] is `true`, the keys will have case-insensitive access. |
+ /// |
+ /// [source] is copied to a new [Map] to ensure changes to the parameter value |
+ /// after constructions are not reflected. |
+ factory ShelfUnmodifiableMap(Map<String, V> source, |
+ {bool ignoreKeyCase: false}) { |
+ if (source is ShelfUnmodifiableMap<V>) { |
+ return source; |
+ } |
+ |
+ if (source == null || source.isEmpty) { |
+ return const _EmptyShelfUnmodifiableMap(); |
+ } |
+ |
+ if (ignoreKeyCase) { |
+ source = new pc.CanonicalizedMap<String, String, V>.from( |
+ source, (key) => key.toLowerCase(), isValidKey: (key) => key != null); |
+ } else { |
+ source = new Map<String, V>.from(source); |
+ } |
+ |
+ return new ShelfUnmodifiableMap<V>._(source); |
+ } |
+ |
+ ShelfUnmodifiableMap._(Map<String, V> source) : super(source); |
+} |
+ |
+/// An const empty implementation of [ShelfUnmodifiableMap]. |
+// TODO(kevmoo): Consider using MapView from dart:collection which has a const |
+// ctor. Would require updating min SDK to 1.5. |
+class _EmptyShelfUnmodifiableMap<V> extends pc.DelegatingMap<String, V> |
+ implements ShelfUnmodifiableMap<V> { |
+ const _EmptyShelfUnmodifiableMap() : super(const {}); |
+} |