import Validations extension Validator { static func validate( _ toChild: KeyPath ) -> Self { self.mapValue({ $0[keyPath: toChild] }, with: ArrayValidator()) } static func validate( _ toChild: KeyPath ) -> Self { self.mapValue({ $0[keyPath: toChild] }, with: ArrayValidator().optional()) } } extension Array where Element: Validatable { static func validator() -> some Validation { ArrayValidator() } } struct ArrayValidator: Validation where Element: Validatable { func validate(_ value: [Element]) throws { for item in value { try item.validate() } } } struct ForEachValidator: Validation where T: Validation, T.Value == E { let validator: T init(@ValidationBuilder builder: () -> T) { self.validator = builder() } func validate(_ value: [E]) throws { for item in value { try validator.validate(item) } } }