gobm65.go
changeset 11 01e6addfa1ee
parent 10 b7ebc8c55b45
child 12 fc4f5c69286b
equal deleted inserted replaced
10:b7ebc8c55b45 11:01e6addfa1ee
   197 	return items, err
   197 	return items, err
   198 }
   198 }
   199 
   199 
   200 func mergeItems(newItems, oldItems []measurement) []measurement {
   200 func mergeItems(newItems, oldItems []measurement) []measurement {
   201 	var result []measurement
   201 	var result []measurement
   202 	var j int
   202 
   203 	// TODO: Would be better to compare dates and merge chronologically...
   203 	// Sort method: isLater returns true if mi's date is later or
   204 	for _, nItem := range newItems {
   204 	// equal to mj's date.
   205 		result = append(result, nItem)
   205 	isLater := func(mi, mj measurement) bool {
   206 		if j+1 <= len(oldItems) && nItem == oldItems[j] {
   206 		switch {
   207 			j++
   207 		case mi.Year < mj.Year:
   208 		}
   208 			return false
   209 	}
   209 		case mi.Year > mj.Year:
   210 	if j+1 <= len(oldItems) {
   210 			return true
   211 		result = append(result, oldItems[j:]...)
   211 		case mi.Month < mj.Month:
       
   212 			return false
       
   213 		case mi.Month > mj.Month:
       
   214 			return true
       
   215 		case mi.Day < mj.Day:
       
   216 			return false
       
   217 		case mi.Day > mj.Day:
       
   218 			return true
       
   219 		case mi.Hour < mj.Hour:
       
   220 			return false
       
   221 		case mi.Hour > mj.Hour:
       
   222 			return true
       
   223 		case mi.Minute < mj.Minute:
       
   224 			return false
       
   225 		default:
       
   226 			return true
       
   227 		}
       
   228 	}
       
   229 
       
   230 	sort.Slice(oldItems, func(i, j int) bool {
       
   231 		return isLater(oldItems[i], oldItems[j])
       
   232 	})
       
   233 	sort.Slice(newItems, func(i, j int) bool {
       
   234 		return isLater(newItems[i], newItems[j])
       
   235 	})
       
   236 
       
   237 	appendIfMissing := func(l []measurement, m measurement) []measurement {
       
   238 		var i int
       
   239 		for i = range l {
       
   240 			if !isLater(l[i], m) {
       
   241 				break
       
   242 			}
       
   243 			if l[i] == m { // Duplicate
       
   244 				return l
       
   245 			}
       
   246 		}
       
   247 		if i == len(l) {
       
   248 			return append(l[:i], m)
       
   249 		}
       
   250 		r := append(l[:i], append(l[i:], m)...)
       
   251 		return r
       
   252 	}
       
   253 
       
   254 	for _, item := range newItems {
       
   255 		result = appendIfMissing(result, item)
       
   256 	}
       
   257 	for _, item := range oldItems {
       
   258 		result = appendIfMissing(result, item)
   212 	}
   259 	}
   213 	return result
   260 	return result
   214 }
   261 }
   215 
   262 
   216 func parseDate(dateStr string) (date time.Time, err error) {
   263 func parseDate(dateStr string) (date time.Time, err error) {