| OLD | NEW |
| 1 // | 1 // |
| 2 // Copyright 2014 Google Inc. All rights reserved. | 2 // Copyright 2014 Google Inc. All rights reserved. |
| 3 // | 3 // |
| 4 // Use of this source code is governed by a BSD-style | 4 // Use of this source code is governed by a BSD-style |
| 5 // license that can be found in the LICENSE file or at | 5 // license that can be found in the LICENSE file or at |
| 6 // https://developers.google.com/open-source/licenses/bsd | 6 // https://developers.google.com/open-source/licenses/bsd |
| 7 // | 7 // |
| 8 | 8 |
| 9 part of charted.core.utils; | 9 part of charted.core.utils; |
| 10 | 10 |
| 11 /// Returns a sum of all values in the given list of values | 11 /// Returns a sum of all values in the given list of values |
| 12 num sum(List values) => | 12 num sum(List values) => values == null || values.isEmpty |
| 13 values == null || values.isEmpty ? | 13 ? 0 |
| 14 0: values.fold(0.0, (old, next) => old + next); | 14 : values.fold(0.0, (old, next) => old + next); |
| 15 | 15 |
| 16 /// Returns the smallest number in the given list of values | 16 /// Returns the smallest number in the given list of values |
| 17 num min(Iterable values) => | 17 num min(Iterable values) => values == null || values.isEmpty |
| 18 values == null || values.isEmpty ? | 18 ? null |
| 19 null : values.fold(values.elementAt(0), math.min); | 19 : values.fold(values.elementAt(0), math.min); |
| 20 | 20 |
| 21 /// Returns the largest number in the given list of values | 21 /// Returns the largest number in the given list of values |
| 22 num max(Iterable values) => | 22 num max(Iterable values) => values == null || values.isEmpty |
| 23 values == null || values.isEmpty ? | 23 ? null |
| 24 null : values.fold(values.elementAt(0), math.max); | 24 : values.fold(values.elementAt(0), math.max); |
| 25 | 25 |
| 26 /// Represents a constant pair of values | 26 /// Represents a constant pair of values |
| 27 class Pair<T1, T2> { | 27 class Pair<T1, T2> { |
| 28 final T1 first; | 28 final T1 first; |
| 29 final T2 last; | 29 final T2 last; |
| 30 | 30 |
| 31 const Pair(this.first, this.last); | 31 const Pair(this.first, this.last); |
| 32 | 32 |
| 33 bool operator==(other) => | 33 bool operator ==(other) => |
| 34 other is Pair && first == other.first && last == other.last; | 34 other is Pair && first == other.first && last == other.last; |
| 35 | 35 |
| 36 int get hashCode => hash2(first, last); | 36 int get hashCode => hash2(first, last); |
| 37 } | 37 } |
| 38 | 38 |
| 39 /// Represents a pair of mininum and maximum values in a List. | 39 /// Represents a pair of mininum and maximum values in a List. |
| 40 class Extent<T> extends Pair<T, T> { | 40 class Extent<T> extends Pair<T, T> { |
| 41 final T min; | 41 final T min; |
| 42 final T max; | 42 final T max; |
| 43 | 43 |
| 44 factory Extent.items(Iterable<T> items, | 44 factory Extent.items(Iterable<T> items, |
| 45 [ Comparator compare = Comparable.compare ]) { | 45 [Comparator compare = Comparable.compare]) { |
| 46 if (items.length == 0) return new Extent(null, null); | 46 if (items.length == 0) return new Extent(null, null); |
| 47 var max = items.first, | 47 var max = items.first, min = items.first; |
| 48 min = items.first; | |
| 49 for (var value in items) { | 48 for (var value in items) { |
| 50 if (compare(max, value) < 0) max = value; | 49 if (compare(max, value) < 0) max = value; |
| 51 if (compare(min, value) > 0) min = value; | 50 if (compare(min, value) > 0) min = value; |
| 52 } | 51 } |
| 53 return new Extent(min, max); | 52 return new Extent(min, max); |
| 54 } | 53 } |
| 55 | 54 |
| 56 const Extent(T min, T max) : min = min, max = max, super(min, max); | 55 const Extent(T min, T max) |
| 56 : min = min, |
| 57 max = max, |
| 58 super(min, max); |
| 57 } | 59 } |
| 58 | 60 |
| 59 /// Iterable representing a range of values containing the start, stop | 61 /// Iterable representing a range of values containing the start, stop |
| 60 /// and each of the step values between them. | 62 /// and each of the step values between them. |
| 61 class Range extends DelegatingList<num> { | 63 class Range extends DelegatingList<num> { |
| 62 final num start; | 64 final num start; |
| 63 final num stop; | 65 final num stop; |
| 64 final num step; | 66 final num step; |
| 65 | 67 |
| 66 factory Range.integers(num start, [num stop, num step = 1]) => | 68 factory Range.integers(num start, [num stop, num step = 1]) => |
| 67 new Range(start, stop, step, true); | 69 new Range(start, stop, step, true); |
| 68 | 70 |
| 69 factory Range(num start, [num stop, num step = 1, bool integers = false]) { | 71 factory Range(num start, [num stop, num step = 1, bool integers = false]) { |
| 70 List<num> values = <num>[]; | 72 List<num> values = <num>[]; |
| 71 | 73 |
| 72 if (stop == null) { | 74 if (stop == null) { |
| 73 stop = start; | 75 stop = start; |
| 74 start = 0; | 76 start = 0; |
| 75 } | 77 } |
| 76 | 78 |
| 77 if (step == 0 || start < stop && step < 0 || start > stop && step > 0) { | 79 if (step == 0 || start < stop && step < 0 || start > stop && step > 0) { |
| 78 throw new ArgumentError('Invalid range.'); | 80 throw new ArgumentError('Invalid range.'); |
| 79 } | 81 } |
| 80 | 82 |
| 81 var k = _integerConversionFactor(step.abs()), | 83 var k = _integerConversionFactor(step.abs()), i = -1, j; |
| 82 i = -1, | |
| 83 j; | |
| 84 | 84 |
| 85 start *= k; | 85 start *= k; |
| 86 stop *= k; | 86 stop *= k; |
| 87 step *= k; | 87 step *= k; |
| 88 | 88 |
| 89 if (step < 0) { | 89 if (step < 0) { |
| 90 while ((j = start + step * ++i) > stop) { | 90 while ((j = start + step * ++i) > stop) { |
| 91 values.add(integers ? j ~/ k : j / k); | 91 values.add(integers ? j ~/ k : j / k); |
| 92 } | 92 } |
| 93 } else { | 93 } else { |
| 94 while ((j = start + step * ++i) < stop) { | 94 while ((j = start + step * ++i) < stop) { |
| 95 values.add(integers ? j ~/ k : j / k); | 95 values.add(integers ? j ~/ k : j / k); |
| 96 } | 96 } |
| 97 } | 97 } |
| 98 | 98 |
| 99 return new Range._internal(start, stop, step, values); | 99 return new Range._internal(start, stop, step, values); |
| 100 } | 100 } |
| 101 | 101 |
| 102 Range._internal(this.start, this.stop, this.step, List values) | 102 Range._internal(this.start, this.stop, this.step, List values) |
| 103 : super(values); | 103 : super(values); |
| 104 | 104 |
| 105 static int _integerConversionFactor(num val) { | 105 static int _integerConversionFactor(num val) { |
| 106 int k = 1; | 106 int k = 1; |
| 107 while (val * k % 1 > 0) { | 107 while (val * k % 1 > 0) { |
| 108 k *= 10; | 108 k *= 10; |
| 109 } | 109 } |
| 110 return k; | 110 return k; |
| 111 } | 111 } |
| 112 } | 112 } |
| OLD | NEW |