package observation // Compose copies and synchronously invokes non-nil observers in order. func Compose[T any, F ~func(T)](observers ...F) F { 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) } } return func(event T) { for _, observer := range selected { observer(event) } } }