Files
most-specific-period/msp/timeline.go

58 lines
1.1 KiB
Go

package msp
import (
"fmt"
"time"
)
type TimeWindow struct {
StartTime time.Time
EndTime time.Time
Identifier string
}
func (p TimeWindow) GetIdentifier() string {
return p.Identifier
}
func (p TimeWindow) GetEndTime() time.Time {
return p.EndTime
}
func (p TimeWindow) GetStartTime() time.Time {
return p.StartTime
}
func (t TimeWindow) String() string {
return fmt.Sprintf("%s\t%s\t%s",
t.GetIdentifier(),
t.GetStartTime(),
t.GetEndTime())
}
// Outputs a formatted timeline of periods
func GenerateTimeline(periods ...Period) (out []Period) {
if len(periods) == 0 {
return out
}
periodsByID := make(map[string]Period)
ids := FlattenPeriods(periods...)
for _, val := range periods {
id := val.GetIdentifier()
periodsByID[id] = val
}
start := periodsByID[ids[0]].GetStartTime()
for _, val := range ids {
next, err := GetNextChangeOver(start, periods...)
if err == nil {
if next.Equal(periodsByID[val].GetStartTime()) {
start = periodsByID[val].GetStartTime()
next = periodsByID[val].GetEndTime()
}
out = append(out, TimeWindow{StartTime: start, EndTime: next, Identifier: val})
start = next
}
}
return out
}