Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(1170)

Side by Side Diff: lib/core/sequences.dart

Issue 11169004: Add "contains" method to Collection. (Closed) Base URL: https://dart.googlecode.com/svn/branches/bleeding_edge/dart
Patch Set: Fixed last illegal-access Created 8 years, 2 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch | Annotate | Revision Log
« no previous file with comments | « lib/core/list.dart ('k') | lib/core/string.dart » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
(Empty)
1 // Copyright (c) 2012, the Dart project authors. Please see the AUTHORS file
2 // for details. All rights reserved. Use of this source code is governed by a
3 // BSD-style license that can be found in the LICENSE file.
4
5 /**
6 * An indexed sequence of elements of the same type.
7 *
8 * This is a primitive interface that any finite integer-indexable
9 * sequence can implement.
10 * It is intended for data structures where access by index is
11 * the most efficient way to access the data.
12 */
13 abstract class Sequence<T> {
14 /**
15 * The limit of valid indices of the sequence.
16 *
17 * The length getter should be efficient.
18 */
19 int get length;
20
21 /**
22 * Returns the value at the given [index].
23 *
24 * Valid indices must be in the range [:0..length - 1:].
25 * The lookup operator should be efficient.
26 */
27 T operator[](int index);
28 }
29
30 /**
31 * A skeleton class for a [Collection] that is also a [Sequence].
32 */
33 abstract class SequenceCollection<E> implements Collection<E>, Sequence<E> {
34 // The class is intended for use as a mixin as well.
35
36 Iterator<E> iterator() => new SequenceIterator(sequence);
37
38 void forEach(f(E element)) {
39 for (int i = 0; i < this.length; i++) f(this[i]);
40 }
41
42 Collection map(f(E element)) {
43 List result = new List();
44 for (int i = 0; i < this.length; i++) {
45 result.add(f(this[i]));
46 }
47 return result;
48 }
49
50 bool contains(E value) {
51 for (int i = 0; i < sequence.length; i++) {
52 if (sequence[i] == value) return true;
53 }
54 return false;
55 }
56
57 reduce(initialValue, combine(previousValue, E element)) {
58 var value = initialValue;
59 for (int i = 0; i < this.length; i++) {
60 value = combine(value, this[i]);
61 }
62 return value;
63 }
64
65 Collection<E> filter(bool f(E element)) {
66 List<E> result = <E>[];
67 for (int i = 0; i < this.length; i++) {
68 E element = this[i];
69 if (f(element)) result.add(element);
70 }
71 return result;
72 }
73
74 bool every(bool f(E element)) {
75 for (int i = 0; i < this.length; i++) {
76 if (!f(this[i])) return false;
77 }
78 return true;
79 }
80
81 bool some(bool f(E element)) {
82 for (int i = 0; i < this.length; i++) {
83 if (f(this[i])) return true;
84 }
85 return false;
86 }
87
88 bool isEmpty() {
89 return this.length == 0;
90 }
91 }
92
93
94 /**
95 * An unmodifiable [List] backed by a [Sequence].
96 */
97 class SequenceList<E> extends SequenceCollection<E> implements List<E> {
98 Sequence<E> sequence;
99 SequenceList(this.sequence);
100
101 int get length => sequence.length;
102
103 T operator[](int index) => sequence[index];
104
105 int indexOf(E value, [int start = 0]) {
106 for (int i = start; i < sequence.length; i++) {
107 if (sequence[i] == value) return i;
108 }
109 return -1;
110 }
111
112 int lastIndexOf(E value, [int start]) {
113 if (start == null) start = sequence.length - 1;
114 for (int i = start; i >= 0; i--) {
115 if (sequence[i] == value) return i;
116 }
117 return -1;
118 }
119
120 E last() => sequence[sequence.length - 1];
121
122 List<E> getRange(int start, int length) {
123 List<E> result = <E>[];
124 for (int i = 0; i < length; i++) {
125 result.add(sequence[start + i]);
126 }
127 return result;
128 }
129
130 void operator []=(int index, E value) {
131 throw new UnsupportedOperationException(
132 "Cannot modify an unmodifiable list");
133 }
134
135 void set length(int newLength) {
136 throw new UnsupportedOperationException(
137 "Cannot change the length of an unmodifiable list");
138 }
139
140 void add(E value) {
141 throw new UnsupportedOperationException(
142 "Cannot add to an unmodifiable list");
143 }
144
145 void addLast(E value) {
146 throw new UnsupportedOperationException(
147 "Cannot add to an unmodifiable list");
148 }
149
150 void addAll(Collection<E> collection) {
151 throw new UnsupportedOperationException(
152 "Cannot add to an unmodifiable list");
153 }
154
155 void sort([Comparator<E> compare]) {
156 throw new UnsupportedOperationException(
157 "Cannot modify an unmodifiable list");
158 }
159
160 void clear() {
161 throw new UnsupportedOperationException(
162 "Cannot clear an unmodifiable list");
163 }
164
165 E removeAt(int index) {
166 throw new UnsupportedOperationException(
167 "Cannot remove in an unmodifiable list");
168 }
169
170 E removeLast() {
171 throw new UnsupportedOperationException(
172 "Cannot remove in an unmodifiable list");
173 }
174
175 void setRange(int start, int length, List<E> from, [int startFrom]) {
176 throw new UnsupportedOperationException(
177 "Cannot modify an unmodifiable list");
178 }
179
180 void removeRange(int start, int length) {
181 throw new UnsupportedOperationException(
182 "Cannot remove in an unmodifiable list");
183 }
184
185 void insertRange(int start, int length, [E initialValue]) {
186 throw new UnsupportedOperationException(
187 "Cannot insert range in an unmodifiable list");
188 }
189 }
190
191 /**
192 * Iterates over a [Sequence] in growing index order.
193 */
194 class SequenceIterator<E> implements Iterator<E> {
195 Sequence<E> _sequence;
196 int _position;
197 SequenceIterator(this._sequence) : _position = 0;
198 bool hasNext() => _position < _sequence.length;
199 E next() {
200 if (hasNext()) return _sequence[_position++];
201 throw new NoMoreElementsException();
202 }
203 }
204
OLDNEW
« no previous file with comments | « lib/core/list.dart ('k') | lib/core/string.dart » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698