233 }) |
233 }) |
234 sort.Slice(newItems, func(i, j int) bool { |
234 sort.Slice(newItems, func(i, j int) bool { |
235 return isLater(newItems[i], newItems[j]) |
235 return isLater(newItems[i], newItems[j]) |
236 }) |
236 }) |
237 |
237 |
238 appendIfMissing := func(l []measurement, m measurement) []measurement { |
238 // insertIfMissing inserts a measurement into a sorted slice |
|
239 insertIfMissing := func(l []measurement, m measurement) []measurement { |
|
240 var later bool |
239 var i int |
241 var i int |
240 for i = range l { |
242 for i = range l { |
241 if !isLater(l[i], m) { |
243 later = isLater(l[i], m) |
|
244 if !later { |
242 break |
245 break |
243 } |
246 } |
244 if l[i] == m { // Duplicate |
247 if l[i] == m { // Duplicate |
245 return l |
248 return l |
246 } |
249 } |
247 } |
250 } |
248 if i == len(l) { |
251 if later { |
249 return append(l[:i], m) |
252 return append(l, m) |
250 } |
253 } |
251 r := append(l[:i], append(l[i:], m)...) |
254 |
252 return r |
255 return append(l[:i], append([]measurement{m}, l[i:]...)...) |
253 } |
256 } |
254 |
257 |
255 for _, item := range newItems { |
258 for _, item := range newItems { |
256 result = appendIfMissing(result, item) |
259 result = insertIfMissing(result, item) |
257 } |
260 } |
258 for _, item := range oldItems { |
261 for _, item := range oldItems { |
259 result = appendIfMissing(result, item) |
262 result = insertIfMissing(result, item) |
260 } |
263 } |
261 return result |
264 return result |
262 } |
265 } |
263 |
266 |
264 func parseDate(dateStr string) (date time.Time, err error) { |
267 func parseDate(dateStr string) (date time.Time, err error) { |