From e6c8726c4a7578e5751a6c6aac9ccc64e4ebdae6 Mon Sep 17 00:00:00 2001 From: Daniil Date: Fri, 21 Aug 2026 15:06:07 +0300 Subject: [PATCH] Fix multiple memory allocations --- internal/utils/time/time.go | 47 ++++++++++++++----------------------- 1 file changed, 18 insertions(+), 29 deletions(-) diff --git a/internal/utils/time/time.go b/internal/utils/time/time.go index a84ef5d..6b9b83c 100644 --- a/internal/utils/time/time.go +++ b/internal/utils/time/time.go @@ -18,43 +18,32 @@ type Range struct { // SplitTimeRangeByInterval returns split by interval time ranges. func SplitTimeRangeByInterval(timeRange Range, interval time.Duration) []Range { - // TODO: refac - from := timeRange.From to := timeRange.To - if interval >= to.Sub(from) { - return []Range{ - { - From: from, - To: to, - }, - } + // Protection against an infinite loop or incorrect data + if interval <= 0 || !from.Before(to) { + return []Range{{From: from, To: to}} } - var result []Range - - next := from - - for next.Before(to) { - curFrom := next - curNext := next.Add(interval) - if curNext.After(to) { - result = append(result, Range{ - From: curFrom, - To: to, - }) - - break - } + totalDist := to.Sub(from) + if interval >= totalDist { + return []Range{{From: from, To: to}} + } - next = curNext + // Calculate the exact number of intervals (rounded up) + count := int((totalDist + interval - 1) / interval) + result := make([]Range, count) - result = append(result, Range{ - From: curFrom, - To: curNext, - }) + currFrom := from + for i := 0; i < count-1; i++ { + currTo := currFrom.Add(interval) + result[i] = Range{From: currFrom, To: currTo} + currFrom = currTo } + // The last interval is guaranteed to be closed using “to” (we avoid flying over) + result[count-1] = Range{From: currFrom, To: to} + return result }