OLD | NEW |
1 // Copyright (c) 2012, the Dart project authors. Please see the AUTHORS file | 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 | 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. | 3 // BSD-style license that can be found in the LICENSE file. |
4 | 4 |
5 /** | 5 /** |
6 * This contains extra functions and classes useful for implementing | 6 * This contains extra functions and classes useful for implementing |
7 * serialiation. Some or all of these will be removed once the functionality is | 7 * serialiation. Some or all of these will be removed once the functionality is |
8 * available in the core library. | 8 * available in the core library. |
9 */ | 9 */ |
10 library serialization_helpers; | 10 library serialization_helpers; |
11 | 11 |
12 /** | 12 /** |
13 * A named function of one argument that just returns it. Useful for using | 13 * A named function of one argument that just returns it. Useful for using |
14 * as a default value for a function parameter or other places where you want | 14 * as a default value for a function parameter or other places where you want |
15 * to concisely provide a function that just returns its argument. | 15 * to concisely provide a function that just returns its argument. |
16 */ | 16 */ |
17 doNothing(x) => x; | 17 doNothing(x) => x; |
18 | 18 |
19 /** Concatenate two lists. Handle the case where one or both might be null. */ | 19 /** Concatenate two lists. Handle the case where one or both might be null. */ |
20 // TODO(alanknight): Remove once issue 5342 is resolved. | 20 // TODO(alanknight): Remove once issue 5342 is resolved. |
21 List append(List a, List b) { | 21 List append(Iterable a, Iterable b) { |
22 if (a == null) { | 22 if (a == null) { |
23 return (b == null) ? [] : new List.from(b); | 23 return (b == null) ? [] : new List.from(b); |
24 } | 24 } |
25 if (b == null) return new List.from(a); | 25 if (b == null) return new List.from(a); |
26 var result = new List.from(a); | 26 var result = new List.from(a); |
27 result.addAll(b); | 27 result.addAll(b); |
28 return result; | 28 return result; |
29 } | 29 } |
30 | 30 |
31 /** | 31 /** |
32 * Return a sorted version of [aCollection], using the default sort criterion. | 32 * Return a sorted version of [anIterable], using the default sort criterion. |
33 * Always returns a List, regardless of the type of [aCollection]. | 33 * Always returns a List, regardless of the type of [anIterable]. |
34 */ | 34 */ |
35 List sorted(aCollection) { | 35 List sorted(anIterable) { |
36 var result = new List.from(aCollection); | 36 var result = new List.from(anIterable); |
37 result.sort(); | 37 result.sort(); |
38 return result; | 38 return result; |
39 } | 39 } |
40 | 40 |
41 /** Helper function for PrimitiveRule to tell which objects it applies to. */ | 41 /** Helper function for PrimitiveRule to tell which objects it applies to. */ |
42 bool isPrimitive(object) { | 42 bool isPrimitive(object) { |
43 return identical(object, null) || object is num || object is String || | 43 return identical(object, null) || object is num || object is String || |
44 identical(object, true) || identical(object, false); | 44 identical(object, true) || identical(object, false); |
45 } | 45 } |
46 | 46 |
(...skipping 51 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
98 MapLikeIterableForMap(collection) : super(collection); | 98 MapLikeIterableForMap(collection) : super(collection); |
99 | 99 |
100 void forEach(Function f) { collection.forEach(f);} | 100 void forEach(Function f) { collection.forEach(f);} |
101 Map copyEmpty() => new Map(); | 101 Map copyEmpty() => new Map(); |
102 } | 102 } |
103 | 103 |
104 class MapLikeIterableForList extends MapLikeIterable { | 104 class MapLikeIterableForList extends MapLikeIterable { |
105 MapLikeIterableForList(collection) : super(collection); | 105 MapLikeIterableForList(collection) : super(collection); |
106 | 106 |
107 void forEach(f) { | 107 void forEach(f) { |
108 Iterator iterator = collection.iterator(); | 108 Iterator iterator = collection.iterator; |
109 for (var i = 0; i < collection.length; i++) { | 109 for (var i = 0; i < collection.length; i++) { |
110 f(i, iterator.next()); | 110 iterator.moveNext(); |
| 111 f(i, iterator.current); |
111 } | 112 } |
112 } | 113 } |
113 | 114 |
114 List copyEmpty() => new List(collection.length); | 115 List copyEmpty() => new List(collection.length); |
115 } | 116 } |
116 | 117 |
117 /** | 118 /** |
118 * An inverse of MapLikeIterable. Lets you iterate polymorphically between | 119 * An inverse of MapLikeIterable. Lets you iterate polymorphically between |
119 * List-like and Map-like things, but making them behave like Lists, instead | 120 * List-like and Map-like things, but making them behave like Lists, instead |
120 * of behaving like Maps. | 121 * of behaving like Maps. |
121 * So values(["a", "b", "c"]).forEach((value) => ...); | 122 * So values(["a", "b", "c"]).forEach((value) => ...); |
122 * will loop over the values "a", "b", "c", as if it were a List of values. | 123 * will loop over the values "a", "b", "c", as if it were a List of values. |
123 * Only supports forEach() and map() operations because that was all I needed | 124 * Only supports forEach() and map() operations because that was all I needed |
124 * for the moment. | 125 * for the moment. |
125 */ | 126 */ |
126 values(x) { | 127 values(x) { |
127 if (x is Iterable) return x; | 128 if (x is Iterable) return x; |
128 if (x is Map) return new ListLikeIterable(x); | 129 if (x is Map) return new ListLikeIterable(x); |
129 throw new ArgumentError("Invalid argument"); | 130 throw new ArgumentError("Invalid argument"); |
130 } | 131 } |
131 | 132 |
| 133 mapValues(x, f) { |
| 134 if (x is Set) return x.mappedBy(f).toSet(); |
| 135 if (x is Iterable) return x.mappedBy(f).toList(); |
| 136 if (x is Map) return new ListLikeIterable(x).map(f); |
| 137 throw new ArgumentError("Invalid argument"); |
| 138 } |
| 139 |
132 /** | 140 /** |
133 * A class for iterating over things as if they were Lists, which primarily | 141 * A class for iterating over things as if they were Lists, which primarily |
134 * means that forEach passes one argument, and map() returns a new Map | 142 * means that forEach passes one argument, and map() returns a new Map |
135 * with the same keys as [collection] and values which haev been transformed | 143 * with the same keys as [collection] and values which haev been transformed |
136 * by the argument to map(). | 144 * by the argument to map(). |
137 */ | 145 */ |
138 class ListLikeIterable { | 146 class ListLikeIterable { |
139 ListLikeIterable(this.collection); | 147 ListLikeIterable(this.collection); |
140 final Map collection; | 148 final Map collection; |
141 | 149 |
(...skipping 10 matching lines...) Expand all Loading... |
152 */ | 160 */ |
153 map(Function f) { | 161 map(Function f) { |
154 var result = new Map(); | 162 var result = new Map(); |
155 collection.forEach((key, value) => result[key] = f(value)); | 163 collection.forEach((key, value) => result[key] = f(value)); |
156 return result; | 164 return result; |
157 } | 165 } |
158 | 166 |
159 /** | 167 /** |
160 * Return an iterator that behaves like a List iterator, taking one parameter. | 168 * Return an iterator that behaves like a List iterator, taking one parameter. |
161 */ | 169 */ |
162 Iterator iterator() => collection.values.iterator(); | 170 Iterator get iterator => collection.values.iterator; |
163 } | 171 } |
164 | 172 |
165 /** | 173 /** |
166 * This acts as a stand-in for some value that cannot be hashed. We can't | 174 * This acts as a stand-in for some value that cannot be hashed. We can't |
167 * just use const Object() because the compiler will fold them together. | 175 * just use const Object() because the compiler will fold them together. |
168 */ | 176 */ |
169 class _Sentinel { | 177 class _Sentinel { |
170 final _wrappedObject; | 178 final _wrappedObject; |
171 const _Sentinel(this._wrappedObject); | 179 const _Sentinel(this._wrappedObject); |
172 } | 180 } |
(...skipping 64 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
237 int get length => keys.length; | 245 int get length => keys.length; |
238 void clear() { | 246 void clear() { |
239 keys.clear(); | 247 keys.clear(); |
240 values.clear(); | 248 values.clear(); |
241 } | 249 } |
242 bool get isEmpty => keys.isEmpty; | 250 bool get isEmpty => keys.isEmpty; |
243 | 251 |
244 // Note that this is doing an equality comparison. | 252 // Note that this is doing an equality comparison. |
245 bool containsValue(x) => values.contains(x); | 253 bool containsValue(x) => values.contains(x); |
246 } | 254 } |
OLD | NEW |