import * as svt from "simple-validation-tools"; export type Option = None | Some; export enum OptionTag { None = "None", Some = "Some", } export type None = { type: OptionTag.None; }; export type Some = { type: OptionTag.Some; data: T; }; export function None(): None { return {type: OptionTag.None}; } export function Some(data: T): Some { return {type: OptionTag.Some, data}; } export function isOption(isT: svt.TypePredicate): svt.TypePredicate> { return function isOptionT(value: unknown): value is Option { return [isNone, isSome(isT)].some((typePredicate) => typePredicate(value)); }; } export function isNone(value: unknown): value is None { return svt.isInterface(value, {type: OptionTag.None}); } export function isSome(isT: svt.TypePredicate): svt.TypePredicate> { return function isSomeT(value: unknown): value is Some { return svt.isInterface>(value, {type: OptionTag.Some, data: isT}); }; } export function validateOption(validateT: svt.Validator): svt.Validator> { return function validateOptionT(value: unknown): svt.ValidationResult> { return svt.validateWithTypeTag>(value, {[OptionTag.None]: validateNone, [OptionTag.Some]: validateSome(validateT)}, "type"); }; } export function validateNone(value: unknown): svt.ValidationResult { return svt.validate(value, {type: OptionTag.None}); } export function validateSome(validateT: svt.Validator): svt.Validator> { return function validateSomeT(value: unknown): svt.ValidationResult> { return svt.validate>(value, {type: OptionTag.Some, data: validateT}); }; }