Index: lib/src/util/iterable_set.dart |
diff --git a/lib/src/util/iterable_set.dart b/lib/src/util/iterable_set.dart |
new file mode 100644 |
index 0000000000000000000000000000000000000000..5166a725a0a8253db399ca6afb1f6375f093b688 |
--- /dev/null |
+++ b/lib/src/util/iterable_set.dart |
@@ -0,0 +1,35 @@ |
+// Copyright (c) 2016, 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. |
+ |
+import 'dart:collection'; |
+ |
+import 'package:collection/collection.dart'; |
+ |
+/// An unmodifiable [Set] view backed by an arbitrary [Iterable]. |
+/// |
+/// Note that contrary to most APIs that take iterables, this does not convert |
+/// its argument to another collection before use. This means that if it's |
+/// lazily-generated, that generation will happen for every operation. |
+/// |
+/// Note also that set operations that are usually expected to be `O(1)` or |
+/// `O(log(n))`, such as [contains], may be `O(n)` for many underlying iterable |
+/// types. As such, this should only be used for small iterables. |
+class IterableSet<E> extends SetMixin<E> with UnmodifiableSetMixin<E> { |
+ /// The base iterable that set operations forward to. |
+ final Iterable<E> _base; |
+ |
+ int get length => _base.length; |
+ |
+ Iterator<E> get iterator => _base.iterator; |
+ |
+ /// Creates a [Set] view of [base]. |
+ IterableSet(this._base); |
+ |
+ bool contains(Object element) => _base.contains(element); |
+ |
+ E lookup(Object needle) => |
+ _base.firstWhere((element) => element == needle, orElse: () => null); |
+ |
+ Set<E> toSet() => _base.toSet(); |
+} |