| OLD | NEW |
| (Empty) |
| 1 // | |
| 2 // Copyright 2014 Google Inc. All rights reserved. | |
| 3 // | |
| 4 // Use of this source code is governed by a BSD-style | |
| 5 // license that can be found in the LICENSE file or at | |
| 6 // https://developers.google.com/open-source/licenses/bsd | |
| 7 // | |
| 8 | |
| 9 library charted.core.time_intervals; | |
| 10 | |
| 11 typedef DateTime TimeFloorFunction(DateTime val); | |
| 12 typedef DateTime TimeStepFunction(DateTime val, int offset); | |
| 13 typedef int TimeToNumberFunction(DateTime val); | |
| 14 | |
| 15 class TimeInterval { | |
| 16 TimeFloorFunction _floor; | |
| 17 TimeStepFunction _step; | |
| 18 TimeToNumberFunction _number; | |
| 19 | |
| 20 TimeInterval(this._floor, this._step, this._number); | |
| 21 | |
| 22 DateTime floor(dynamic date) { | |
| 23 assert(date is int || date is DateTime); | |
| 24 if (date is int) { | |
| 25 date = new DateTime.fromMillisecondsSinceEpoch(date) ; | |
| 26 } | |
| 27 return _floor(date); | |
| 28 } | |
| 29 | |
| 30 DateTime round(dynamic date) { | |
| 31 DateTime d0 = floor(date), | |
| 32 d1 = offset(d0, 1); | |
| 33 int ms = date is int ? date : date.millisecondsSinceEpoch; | |
| 34 return (ms - d0.millisecondsSinceEpoch < d1.millisecondsSinceEpoch - ms) | |
| 35 ? d0 | |
| 36 : d1; | |
| 37 } | |
| 38 | |
| 39 DateTime ceil(dynamic date) => offset(floor(date), 1); | |
| 40 | |
| 41 DateTime offset(DateTime date, int k) => _step(date, k); | |
| 42 | |
| 43 Iterable<DateTime> range(dynamic t0, dynamic t1, int dt) { | |
| 44 assert(t0 is int || t0 is DateTime); | |
| 45 assert(t1 is int || t1 is DateTime); | |
| 46 | |
| 47 List<DateTime> values = []; | |
| 48 if (t1 is int) { | |
| 49 t1 = new DateTime.fromMillisecondsSinceEpoch(t1); | |
| 50 } | |
| 51 | |
| 52 DateTime time = ceil(t0); | |
| 53 if (dt > 1) { | |
| 54 while (time.isBefore(t1)) { | |
| 55 if ((_number(time) % dt) == 0) { | |
| 56 values.add( | |
| 57 new DateTime.fromMillisecondsSinceEpoch( | |
| 58 time.millisecondsSinceEpoch)); | |
| 59 } | |
| 60 time = _step(time, 1); | |
| 61 } | |
| 62 } | |
| 63 else { | |
| 64 while (time.isBefore(t1)) { | |
| 65 values.add( | |
| 66 new DateTime.fromMillisecondsSinceEpoch( | |
| 67 time.millisecondsSinceEpoch)); | |
| 68 time = _step(time, 1); | |
| 69 } | |
| 70 } | |
| 71 return values; | |
| 72 } | |
| 73 | |
| 74 static TimeInterval second = new TimeInterval( | |
| 75 (DateTime date) => | |
| 76 new DateTime.fromMillisecondsSinceEpoch( | |
| 77 (date.millisecondsSinceEpoch ~/ 1000) * 1000), | |
| 78 (DateTime date, int offset) => | |
| 79 date = new DateTime.fromMillisecondsSinceEpoch( | |
| 80 date.millisecondsSinceEpoch + offset * 1000), | |
| 81 (DateTime date) => date.second); | |
| 82 | |
| 83 static TimeInterval minute = new TimeInterval( | |
| 84 (DateTime date) => | |
| 85 new DateTime.fromMillisecondsSinceEpoch( | |
| 86 (date.millisecondsSinceEpoch ~/ 60000) * 60000), | |
| 87 (DateTime date, int offset) => | |
| 88 date = new DateTime.fromMillisecondsSinceEpoch( | |
| 89 date.millisecondsSinceEpoch + offset * 60000), | |
| 90 (DateTime date) => date.minute); | |
| 91 | |
| 92 static TimeInterval hour = new TimeInterval( | |
| 93 (DateTime date) => | |
| 94 new DateTime.fromMillisecondsSinceEpoch( | |
| 95 (date.millisecondsSinceEpoch ~/ 3600000) * 3600000), | |
| 96 (DateTime date, int offset) => | |
| 97 date = new DateTime.fromMillisecondsSinceEpoch( | |
| 98 date.millisecondsSinceEpoch + offset * 3600000), | |
| 99 (DateTime date) => date.hour); | |
| 100 | |
| 101 static TimeInterval day = new TimeInterval( | |
| 102 (DateTime date) => | |
| 103 new DateTime(date.year, date.month, date.day), | |
| 104 (DateTime date, int offset) => | |
| 105 new DateTime(date.year, date.month, date.day + offset, | |
| 106 date.hour, date.minute, date.second, date.millisecond), | |
| 107 (DateTime date) => date.day - 1); | |
| 108 | |
| 109 static TimeInterval week = new TimeInterval( | |
| 110 (DateTime date) => | |
| 111 new DateTime(date.year, date.month, date.day - (date.weekday % 7)), | |
| 112 (DateTime date, int offset) => | |
| 113 new DateTime(date.year, date.month, date.day + offset * 7, | |
| 114 date.hour, date.minute, date.second, date.millisecond ), | |
| 115 (DateTime date) { | |
| 116 var day = year.floor(date).day; | |
| 117 return (dayOfYear(date) + day % 7) ~/ 7; | |
| 118 }); | |
| 119 | |
| 120 static TimeInterval month = new TimeInterval( | |
| 121 (DateTime date) => new DateTime(date.year, date.month, 1), | |
| 122 (DateTime date, num offset) => | |
| 123 new DateTime(date.year, date.month + offset, date.day, | |
| 124 date.hour, date.minute, date.second, date.millisecond), | |
| 125 (DateTime date) => date.month - 1); | |
| 126 | |
| 127 static TimeInterval year = new TimeInterval( | |
| 128 (DateTime date) => new DateTime(date.year), | |
| 129 (DateTime date, num offset) => | |
| 130 new DateTime(date.year + offset, date.month, date.day, | |
| 131 date.hour, date.minute, date.second, date.millisecond), | |
| 132 (DateTime date) => date.year); | |
| 133 | |
| 134 static int dayOfYear(DateTime date) => | |
| 135 date.difference(year.floor(date)).inDays; | |
| 136 } | |
| OLD | NEW |