# HG changeset patch # User Mikael Berthe # Date 1488115555 -3600 # Node ID 01e6addfa1ee9ea5a9c0e9ce6b9b55baa0b9ccd1 # Parent b7ebc8c55b45423964e551083c8ca1cdcb4b8daf Improve merging diff -r b7ebc8c55b45 -r 01e6addfa1ee gobm65.go --- a/gobm65.go Wed Feb 22 21:01:21 2017 +0100 +++ b/gobm65.go Sun Feb 26 14:25:55 2017 +0100 @@ -199,16 +199,63 @@ func mergeItems(newItems, oldItems []measurement) []measurement { var result []measurement - var j int - // TODO: Would be better to compare dates and merge chronologically... - for _, nItem := range newItems { - result = append(result, nItem) - if j+1 <= len(oldItems) && nItem == oldItems[j] { - j++ + + // Sort method: isLater returns true if mi's date is later or + // equal to mj's date. + isLater := func(mi, mj measurement) bool { + switch { + case mi.Year < mj.Year: + return false + case mi.Year > mj.Year: + return true + case mi.Month < mj.Month: + return false + case mi.Month > mj.Month: + return true + case mi.Day < mj.Day: + return false + case mi.Day > mj.Day: + return true + case mi.Hour < mj.Hour: + return false + case mi.Hour > mj.Hour: + return true + case mi.Minute < mj.Minute: + return false + default: + return true } } - if j+1 <= len(oldItems) { - result = append(result, oldItems[j:]...) + + sort.Slice(oldItems, func(i, j int) bool { + return isLater(oldItems[i], oldItems[j]) + }) + sort.Slice(newItems, func(i, j int) bool { + return isLater(newItems[i], newItems[j]) + }) + + appendIfMissing := func(l []measurement, m measurement) []measurement { + var i int + for i = range l { + if !isLater(l[i], m) { + break + } + if l[i] == m { // Duplicate + return l + } + } + if i == len(l) { + return append(l[:i], m) + } + r := append(l[:i], append(l[i:], m)...) + return r + } + + for _, item := range newItems { + result = appendIfMissing(result, item) + } + for _, item := range oldItems { + result = appendIfMissing(result, item) } return result }