diff --git a/utils.go b/utils.go index d1adfee..d06d6c6 100644 --- a/utils.go +++ b/utils.go @@ -75,3 +75,57 @@ func escapeString(dst []byte, s string) []byte { dst = append(dst, '"') return dst } + +func InsertEventIntoDescendingList(sortedArray []*Event, event *Event) []*Event { + size := len(sortedArray) + start := 0 + end := size - 1 + var mid int + position := start + + if end < 0 { + return []*Event{event} + } else if event.CreatedAt < sortedArray[end].CreatedAt { + return append(sortedArray, event) + } else if event.CreatedAt > sortedArray[start].CreatedAt { + newArr := make([]*Event, size+1) + newArr[0] = event + copy(newArr[1:], sortedArray) + return newArr + } else if event.CreatedAt == sortedArray[start].CreatedAt { + position = start + } else { + for { + if end <= start+1 { + position = end + break + } + mid = int(start + (end-start)/2) + if sortedArray[mid].CreatedAt > event.CreatedAt { + start = mid + } else if sortedArray[mid].CreatedAt < event.CreatedAt { + end = mid + } else { + position = mid + break + } + } + } + + if sortedArray[position].ID != event.ID { + if cap(sortedArray) > size { + newArr := sortedArray[0 : size+1] + copy(newArr[position+1:], sortedArray[position:]) + newArr[position] = event + return newArr + } else { + newArr := make([]*Event, size+1, size+5) + copy(newArr[:position], sortedArray[:position]) + copy(newArr[position+1:], sortedArray[position:]) + newArr[position] = event + return newArr + } + } + + return sortedArray +}