import { TypeGuard } from "ts-type-guards" ; export type ParseResult < T > = Readonly < { kind : "valid" ; value : T ; } | { kind : "invalid" ; input : string ; } > ; export type Parser < T > = ( input : string ) => ParseResult < T > ; export function enumParser < T > ( typeGuard ) { return ( input ) : ParseResult < T > => ( typeGuard ( input ) ? { kind : "valid" , value : input } : { kind : "invalid" , input : input } ) ; } export function booleanParser ( input ) { return ( input === "true" ? { kind : "valid" , value : true } : ( input === "false" ? { kind : "valid" , value : false } : { kind : "invalid" , input : input } ) ) ; } export function urlParser ( input ) { try { return { kind : "valid" , value : new URL ( input ) . toString ( ) } ; } catch ( _ ) { return { kind : "invalid" , input : input } ; } }