diff --git a/msp/changeover.go b/msp/changeover.go new file mode 100644 index 0000000..ff08448 --- /dev/null +++ b/msp/changeover.go @@ -0,0 +1,51 @@ +package msp + +import ( + "sort" + "time" +) + +func GetChangeOvers(periods ...Period) (changeovers []time.Time) { + timeStamps := []time.Time{} + for _, x := range periods { + timeStamps = append(timeStamps, x.GetEndTime()) + timeStamps = append(timeStamps, x.GetStartTime()) + } + sort.Slice(timeStamps, func(i, j int) bool { + return timeStamps[i].Before(timeStamps[j]) + }) + + for _, ts := range timeStamps { + before := ts.Add(-1 * time.Nanosecond) + after := ts.Add(1 * time.Nanosecond) + from, _ := MostSpecificPeriod(before, periods...) + to, _ := MostSpecificPeriod(after, periods...) + if from == to { + continue + } + changeovers = append(changeovers, ts) + } + return +} + +func GetNextChangeOver(t time.Time, periods ...Period) (ts time.Time, err error) { + changeOvers := GetChangeOvers(periods...) + for _, ts := range changeOvers { + if ts.After(t) { + return ts, nil + } + } + return time.Unix(0, 0), ErrNoNextChangeover +} + +func FlattenPeriods(periods ...Period) (ids []string) { + changeovers := GetChangeOvers(periods...) + for _, c := range changeovers { + id, err := MostSpecificPeriod(c, periods...) + if err != nil { + continue + } + ids = append(ids, id) + } + return +} diff --git a/msp/errors.go b/msp/errors.go index ff500f7..ba5aa9b 100644 --- a/msp/errors.go +++ b/msp/errors.go @@ -9,4 +9,6 @@ var ( ErrEndAfterStart = errors.New("error: start time is after end time") // ErrNoValidPeriods occurs when an empty set of periods is passed or when ll periods are invalid ErrNoValidPeriods = errors.New("error: no valid periods available") + // ErrNoNextChangeover occurs when GetNextChangeover is called but there are no changeovers after t + ErrNoNextChangeover = errors.New("error: no valid periods available") )