| Index: client/util/CollectionUtils.dart
|
| ===================================================================
|
| --- client/util/CollectionUtils.dart (revision 4144)
|
| +++ client/util/CollectionUtils.dart (working copy)
|
| @@ -1,139 +0,0 @@
|
| -// Copyright (c) 2011, 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.
|
| -
|
| -typedef num NumericValueSelector<T>(T value);
|
| -
|
| -/**
|
| - * General purpose collection utilities.
|
| - * TODO(jmesserly): make these top level functions?
|
| - */
|
| -class CollectionUtils {
|
| -
|
| - static void insertAt(List arr, int pos, value) {
|
| - assert (pos >= 0);
|
| - assert (pos <= arr.length);
|
| -
|
| - if (pos == arr.length) {
|
| - arr.add(value);
|
| - } else {
|
| - // TODO(sigmund): replace this push with a call that ensures capacity
|
| - // (currently not supported in the JS implementation of list). E.g.
|
| - // [: arr.length = arr.length + 1; :]
|
| - arr.add(null);
|
| -
|
| - // shift elements from [pos] (note: arr already has null @ length - 1)
|
| - for (int i = arr.length - 2; i >= pos; i--) {
|
| - arr[i + 1] = arr[i];
|
| - }
|
| - arr[pos] = value;
|
| -
|
| - // TODO(jmesserly): we won't need to do this once List
|
| - // implements insertAt
|
| - if (arr is ObservableList) {
|
| - // TODO(jmesserly): shouldn't need to cast after testing instanceof
|
| - ObservableList obs = arr;
|
| - obs.recordListInsert(pos, value);
|
| - }
|
| - }
|
| - }
|
| -
|
| - // Collection<T> supports most of the ES 5 list methods, but it's missing
|
| - // map.
|
| -
|
| - // TODO(jmesserly): we might want a version of this that return an iterable,
|
| - // however JS, Python and Ruby versions are all eager.
|
| - static List map(Iterable source, var mapper) {
|
| - // TODO(jmesserly): I was trying to set the capacity here, but instead it
|
| - // seems to create a fixed list. Hence assigning by index below.
|
| - List result = new List(source is List ? source.dynamic.length : null);
|
| - int i = 0;
|
| - for (final item in source) {
|
| - result[i++] = mapper(item);
|
| - }
|
| - return result;
|
| - }
|
| -
|
| - /**
|
| - * Finds the item in [source] that matches [test]. Returns null if
|
| - * no item matches. The typing should be:
|
| - * T find(Iterable<T> source, bool test(T item)), but we don't have generic
|
| - * functions.
|
| - */
|
| - static find(Iterable source, bool test(item)) {
|
| - for (final item in source) {
|
| - if (test(item)) return item;
|
| - }
|
| -
|
| - return null;
|
| - }
|
| -
|
| - /** Compute the minimum of an iterable. Returns null if empty. */
|
| - static num min(Iterable source) {
|
| - final iter = source.iterator();
|
| - if (!iter.hasNext()) {
|
| - return null;
|
| - }
|
| - num best = iter.next();
|
| - while (iter.hasNext()) {
|
| - best = Math.min(best, iter.next());
|
| - }
|
| - return best;
|
| - }
|
| -
|
| - /** Compute the maximum of an iterable. Returns null if empty. */
|
| - static num max(Iterable source) {
|
| - final iter = source.iterator();
|
| - if (!iter.hasNext()) {
|
| - return null;
|
| - }
|
| - num best = iter.next();
|
| - while (iter.hasNext()) {
|
| - best = Math.max(best, iter.next());
|
| - }
|
| - return best;
|
| - }
|
| -
|
| - /** Orders an iterable by its values, or by a key selector. */
|
| - static List orderBy(Iterable source, [NumericValueSelector selector = null]) {
|
| - final result = new List.from(source);
|
| - sortBy(result, selector);
|
| - return result;
|
| - }
|
| -
|
| - /** Sorts a list by its values, or by a key selector. */
|
| - // TODO(jmesserly): we probably don't want to call the key selector more than
|
| - // once for a given element. This would improve performance and the API
|
| - // contract could be stronger.
|
| - static void sortBy(List list, [NumericValueSelector selector = null]) {
|
| - if (selector != null) {
|
| - list.sort((x, y) => selector(x) - selector(y));
|
| - } else {
|
| - list.sort((x, y) => x - y);
|
| - }
|
| - }
|
| -
|
| - /** Compute the sum of an iterable. An empty iterable is an error. */
|
| - static num sum(Iterable source, [NumericValueSelector selector = null]) {
|
| - final iter = source.iterator();
|
| - num total = 0;
|
| - if (selector != null) {
|
| - do {
|
| - total += selector(iter.next());
|
| - } while (iter.hasNext());
|
| - } else {
|
| - do {
|
| - total += iter.next();
|
| - } while (iter.hasNext());
|
| - }
|
| - return total;
|
| - }
|
| -
|
| - // TODO(jmesserly): something like should exist on Map, either a method or a
|
| - // constructor, see bug #5340679
|
| - static void copyMap(Map dest, Map source) {
|
| - for (final k in source.getKeys()) {
|
| - dest[k] = source[k];
|
| - }
|
| - }
|
| -}
|
|
|