func And[T any](
predicates ...Predicate[T],
if len(predicates) < 2 {
panic(fmt.Sprintf("And requires at least 2 predicates, got %v", len(predicates)))
}
for _, p := range predicates {
switch p := p.(type) {
case *AndImpl[T]:
flattened = appendPredicates(flattened, p.Predicates...)