kiwimix/pkg/calendarops/merge.go

46 lines
1.2 KiB
Go

package calendarops
import (
"sort"
basetypes "code.apps.glenux.net/glenux/kiwimix/pkg/basetypes"
)
// MergeCalendarOperation fusionne les événements qui se chevauchent dans un calendrier.
type MergeCalendarOperation struct {
}
// Ensure FilterCalendarOperation implements CalendarOperation
var _ CalendarOperation = (*MergeCalendarOperation)(nil)
// NewMergeCalendarOperation crée une nouvelle instance de MergeCalendarOperation.
func NewMergeCalendarOperation() *MergeCalendarOperation {
return &MergeCalendarOperation{}
}
// Execute réalise l'opération de fusion.
func (op *MergeCalendarOperation) Execute(cal ...basetypes.Calendar) (basetypes.Calendar, error) {
if len(cal.Events) == 0 {
return cal, nil
}
sort.Slice(cal.Event, func(i, j int) bool {
return cal.Event[i].Start.Before(cal.Event[j].Start)
})
mergedEvents := []basetypes.Event{cal.Event[0]}
for _, event := range cal.Event[1:] {
lastEvent := &mergedEvents[len(mergedEvents)-1]
if event.Start.Before(lastEvent.End) || event.Start.Equal(lastEvent.End) {
if event.End.After(lastEvent.End) {
lastEvent.End = event.End
}
} else {
mergedEvents = append(mergedEvents, event)
}
}
return &basetypes.Calendar{Events: mergedEvents}, nil
}