mirror of
https://github.com/taigrr/most-specific-period.git
synced 2026-04-02 03:38:41 -07:00
58 lines
1.1 KiB
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
|
|
}
|