| OLD | NEW |
| (Empty) |
| 1 /// Misc things that were useful when porting the code from Python. | |
| 2 library utils; | |
| 3 | |
| 4 import 'constants.dart'; | |
| 5 | |
| 6 typedef bool Predicate(); | |
| 7 | |
| 8 class Pair<F, S> { | |
| 9 final F first; | |
| 10 final S second; | |
| 11 | |
| 12 const Pair(this.first, this.second); | |
| 13 | |
| 14 int get hashCode => 37 * first.hashCode + second.hashCode; | |
| 15 bool operator ==(other) => other.first == first && other.second == second; | |
| 16 } | |
| 17 | |
| 18 int parseIntRadix(String str, [int radix = 10]) { | |
| 19 int val = 0; | |
| 20 for (int i = 0; i < str.length; i++) { | |
| 21 var digit = str.codeUnitAt(i); | |
| 22 if (digit >= LOWER_A) { | |
| 23 digit += 10 - LOWER_A; | |
| 24 } else if (digit >= UPPER_A) { | |
| 25 digit += 10 - UPPER_A; | |
| 26 } else { | |
| 27 digit -= ZERO; | |
| 28 } | |
| 29 val = val * radix + digit; | |
| 30 } | |
| 31 return val; | |
| 32 } | |
| 33 | |
| 34 bool any(List<bool> iterable) => iterable.any((f) => f); | |
| 35 | |
| 36 bool startsWithAny(String str, List<String> prefixes) { | |
| 37 for (var prefix in prefixes) { | |
| 38 if (str.startsWith(prefix)) { | |
| 39 return true; | |
| 40 } | |
| 41 } | |
| 42 return false; | |
| 43 } | |
| 44 | |
| 45 // Like the python [:] operator. | |
| 46 List slice(List list, int start, [int end]) { | |
| 47 if (end == null) end = list.length; | |
| 48 if (end < 0) end += list.length; | |
| 49 | |
| 50 // Ensure the indexes are in bounds. | |
| 51 if (end < start) end = start; | |
| 52 if (end > list.length) end = list.length; | |
| 53 return list.sublist(start, end); | |
| 54 } | |
| 55 | |
| 56 bool allWhitespace(String str) { | |
| 57 for (int i = 0; i < str.length; i++) { | |
| 58 if (!isWhitespaceCC(str.codeUnitAt(i))) return false; | |
| 59 } | |
| 60 return true; | |
| 61 } | |
| 62 | |
| 63 String padWithZeros(String str, int size) { | |
| 64 if (str.length == size) return str; | |
| 65 var result = new StringBuffer(); | |
| 66 size -= str.length; | |
| 67 for (int i = 0; i < size; i++) result.write('0'); | |
| 68 result.write(str); | |
| 69 return result.toString(); | |
| 70 } | |
| 71 | |
| 72 // TODO(jmesserly): this implementation is pretty wrong, but I need something | |
| 73 // quick until dartbug.com/1694 is fixed. | |
| 74 /// Format a string like Python's % string format operator. Right now this only | |
| 75 /// supports a [data] dictionary used with %s or %08x. Those were the only | |
| 76 /// things needed for [errorMessages]. | |
| 77 String formatStr(String format, Map data) { | |
| 78 if (data == null) return format; | |
| 79 data.forEach((key, value) { | |
| 80 var result = new StringBuffer(); | |
| 81 var search = '%($key)'; | |
| 82 int last = 0, match; | |
| 83 while ((match = format.indexOf(search, last)) >= 0) { | |
| 84 result.write(format.substring(last, match)); | |
| 85 match += search.length; | |
| 86 | |
| 87 int digits = match; | |
| 88 while (isDigit(format[digits])) { | |
| 89 digits++; | |
| 90 } | |
| 91 int numberSize; | |
| 92 if (digits > match) { | |
| 93 numberSize = int.parse(format.substring(match, digits)); | |
| 94 match = digits; | |
| 95 } | |
| 96 | |
| 97 switch (format[match]) { | |
| 98 case 's': | |
| 99 result.write(value); | |
| 100 break; | |
| 101 case 'd': | |
| 102 var number = value.toString(); | |
| 103 result.write(padWithZeros(number, numberSize)); | |
| 104 break; | |
| 105 case 'x': | |
| 106 var number = value.toRadixString(16); | |
| 107 result.write(padWithZeros(number, numberSize)); | |
| 108 break; | |
| 109 default: throw "not implemented: formatStr does not support format " | |
| 110 "character ${format[match]}"; | |
| 111 } | |
| 112 | |
| 113 last = match + 1; | |
| 114 } | |
| 115 | |
| 116 result.write(format.substring(last, format.length)); | |
| 117 format = result.toString(); | |
| 118 }); | |
| 119 | |
| 120 return format; | |
| 121 } | |
| OLD | NEW |