import CoreFoundation import Foundation public class AnyValueValidator: @unchecked Sendable { private let validate: (T) -> Bool public init(_ isValid: @escaping (T) -> Bool) { validate = isValid } public func isValid(_ value: T) -> Bool { validate(value) } } public final class AnyArrayValueValidator: AnyValueValidator<[T]>, @unchecked Sendable {} public func makeCFStringValidator(minLength: Int) -> AnyValueValidator { AnyValueValidator { CFStringGetLength($0) >= minLength } } public func makeStringValidator( minLength: Int = 0, regex: String? = nil ) -> AnyValueValidator { AnyValueValidator { str in if str.index(str.startIndex, offsetBy: minLength, limitedBy: str.endIndex) == nil { return false } return regex.map { (try? str.matchesPattern($0)) ?? true } ?? true } } public func makeURLValidator(schemes: [String]) -> AnyValueValidator { AnyValueValidator { $0.scheme.map(schemes.contains) ?? false } } @inlinable public func makeValueValidator( valueValidator: @escaping (T) -> Bool ) -> AnyValueValidator { AnyValueValidator(valueValidator) } @inlinable public func makeNoOpValueValidator() -> AnyValueValidator { AnyValueValidator { _ in true } } @inlinable public func makeArrayValidator(minItems: Int) -> AnyArrayValueValidator { AnyArrayValueValidator { $0.count >= minItems } }