Keep observer composition storage proportional to selected callbacks

This commit is contained in:
2026-11-14 14:29:39 +00:00
parent 64cf84c9b5
commit 892cb74e6e
3 changed files with 47 additions and 5 deletions

View File

@@ -2,15 +2,26 @@ package observation
// Compose copies and synchronously invokes non-nil observers in order.
func Compose[T any, F ~func(T)](observers ...F) F {
selected := make([]F, 0, len(observers))
count := 0
var single F
for _, observer := range observers {
if observer != nil {
count++
single = observer
}
}
if count == 0 {
return nil
}
if count == 1 {
return single
}
selected := make([]F, 0, count)
for _, observer := range observers {
if observer != nil {
selected = append(selected, observer)
}
}
if len(selected) == 0 {
return nil
}
return func(event T) {
for _, observer := range selected {
observer(event)