type ValidationMessage = string; type ValidationSuccess = []; type ValidationErr = [ValidationMessage, ...ValidationMessage[]]; export type ValidationInfo = ValidationSuccess | ValidationErr; export type Validator = (_: T) => ValidationInfo; export const isValidationSuccess = (info: ValidationInfo): info is ValidationSuccess => !info?.length; export const isValidationErr = (info: ValidationInfo): info is ValidationErr => Boolean(info?.length); type Predicate = (_: T) => boolean; export const validator = (predicate: Predicate) => (message: string): Validator => (_) => predicate(_) ? [] : [message];