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

Side by Side Diff: pkg/serialization/lib/src/serialization_helpers.dart

Issue 11293283: Initial version of a serialization framework (Closed) Base URL: http://dart.googlecode.com/svn/branches/bleeding_edge/dart/
Patch Set: Created 8 years, 1 month 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
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 * This contains extra functions and classes useful for implementing
7 * serialiation. Some or all of them might be removable with changes to the
8 * core library.
9 */
10 library serialization_helpers;
11
12 /**
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
15 * to concisely provide a function that just returns its argument.
16 */
17 doNothing(x) => x;
18
19 /** Concatenate two lists. Handle the case where one or both might be null. */
20 append(List a, List b) {
21 if (a == null) {
22 if (b == null) return []; else return new List.from(b);
23 }
24 if (b == null) return new List.from(a);
25 var result = new List.from(a);
26 result.addAll(b);
27 return result;
28 }
29
30 /**
31 * Return a sorted version of [aCollection], using the default sort criterion.
32 * Always returns a List, regardless of the type of [aCollection].
33 */
34 List sorted(aCollection) {
35 var result = new List.from(aCollection);
36 result.sort();
37 return result;
38 }
39
40 /**
41 * Be able to iterate polymorphically between List-like and Map-like things.
42 * For example, keysAndValues(["a", "b", "c"]).forEach((key, value) => ...);
43 * will loop over the key/value pairs 1/"a", 2/"b", 3/"c", as if the argument
44 * was a Map from integer keys to string values.
45 * Only supports forEach() and map() operations because that was all the code
46 * needed for the moment.
47 */
48 MapLikeIterable keysAndValues(x) => new MapLikeIterable(x);
49
50 /**
51 * A class for iterating over things as if they were Maps, which primarily
52 * means that forEach() and map() pass two arguments, and map() returns a new
53 * Map with the same keys as [collection] and values which have been transformed
54 * by the argument to map().
55 */
56 class MapLikeIterable {
57 MapLikeIterable(this.collection);
58 final collection;
59
60 /** Iterate over the collection, passing both key and value parameters. */
61 void forEach(Function f) {
62 if (collection is Map) {
63 collection.forEach(f);
64 } else {
65 Iterator iterator = collection.iterator();
66 for (var i = 0; i < collection.length; i++) {
67 f(i, iterator.next());
68 }
69 }
70 }
71
72 /**
73 * Return a new collection whose keys are the same as [collection], but whose
74 * values are the result of applying [f] to the key/value pairs. So, if
75 * [collection] is a List, it will be the same as the map() method if the
76 * [key] parameter wasn't passed.
77 */
78 map(Function f) {
79 var result = copyEmpty();
80 forEach((key, value) {
81 result[key] = f(key, value);
82 });
83 return result;
84 }
85
86 /**
87 * Return an empty copy of our collection. Very limited, only knows enough
88 * to return a Map or List as appropriate.
89 */
90 copyEmpty() {
91 if (collection is Map) return new Map();
92 return new List(collection.length);
93 }
94
95 /**
96 * Return an iterator for [collection]. If it's a Map, then return an iterator
97 * on its values. Otherwise just return the collection's normal iterator.
98 */
99 Iterator iterator() {
100 if (collection is Map) {
101 return collection.values.iterator();
102 } else {
103 return collection.iterator();
104 }
105 }
106 }
107
108 /**
109 * An inverse of MapLikeIterable. Lets you iterate polymorphically between
110 * List-like and Map-like things, but making them behave like Lists, instead
111 * of behaving like Maps.
112 * So values(["a", "b", "c"]).forEach((value) => ...);
113 * will loop over the values "a", "b", "c", as if it were a List of values.
114 * Only supports forEach() and map() operations because that was all I needed
115 * for the moment.
116 */
117 ListLikeIterable values(x) => new ListLikeIterable(x);
118
119 /**
120 * A class for iterating over things as if they were Lists, which primarily
121 * means that forEach passes one argument, and map() returns a new Map
122 * with the same keys as [collection] and values which haev been transformed
123 * by the argument to map().
124 */
125 class ListLikeIterable {
126 ListLikeIterable(this.collection);
127 final collection;
128
129 /** Iterate over the collection, passing just the value parameters. */
130 forEach(f) {
131 if (collection is Map) {
132 collection.forEach((key, value) => f(value));
133 } else {
134 collection.forEach(f);
135 }
136 }
137
138 /**
139 * Return a new collection whose keys are the same as [collection], but whose
140 * values are the result of applying [f] to the key/value pairs. So, if
141 * [collection] is a List, it will be the same as if map() had been called
142 * directly on [collection].
143 */
144 map(Function f) {
145 if (collection is Map) {
146 var result = copyEmpty();
147 collection.forEach((key, value) {
148 result[key] = f(value);
149 });
150 return result;
151 } else {
152 return collection.map(f);
153 }
154 }
155
156 /**
157 * Return an empty copy of our collection. Very limited, only knows enough
158 * to return a Map or List as appropriate.
159 */
160 copyEmpty() {
161 if (collection is Map) return new Map();
162 return new List(collection.length);
163 }
164
165 /**
166 * Return an iterator that behaves like a List iterator, taking one parameter.
167 */
168 Iterator iterator() {
169 if (collection is Map) {
170 return collection.values.iterator();
171 } else {
172 return collection.iterator();
173 }
174 }
175 }
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698