| package cartesian | 
 |  | 
 | // Product returns cartesian product of arguments. Each argument must be a slice | 
 | // of the same kind. | 
 | func Product[T any](dimensions ...[]T) [][]T { | 
 | 	if len(dimensions) == 0 { | 
 | 		return nil | 
 | 	} | 
 |  | 
 | 	head, tail := dimensions[0], dimensions[1:] | 
 | 	tailProduct := Product[T](tail...) | 
 |  | 
 | 	var result [][]T | 
 | 	for _, v := range head { | 
 | 		if len(tailProduct) == 0 { | 
 | 			result = append(result, []T{v}) | 
 | 		} else { | 
 | 			for _, ttail := range tailProduct { | 
 | 				element := []T{ | 
 | 					v, | 
 | 				} | 
 | 				element = append(element, ttail...) | 
 | 				result = append(result, element) | 
 | 			} | 
 | 		} | 
 |  | 
 | 	} | 
 | 	return result | 
 | } |