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)) 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) } } }