const userinfo: PS.Parser<string> = PS.co(function* () { const uu: L.List<string> = yield PS.many(uchar(';:&=+$,')); yield PS.char('@'); return PS.pure(joinStr(uu) + '@'); });
return p.chain(x => PS.many(r).map(xs => L.cons(x, xs)));
const pathRootLess: PS.Parser<string> = PS.co(function* () { const s1: string = yield segmentNz; const ss: L.List<string> = yield PS.many(slashSegment); return PS.pure(s1 + joinStr(ss)); });
const pathNoScheme: PS.Parser<string> = segmentNzc.chain(s1 => PS.many(slashSegment).map(ss => s1 + joinStr(ss)));
const port: PS.Parser<string> = PS.char(':').chain(() => PS.many(PS.anyDigit)).map(xs => `:${joinStr(xs)}`);
const ipLiteral: PS.Parser<string> = PS.between( PS.char('['), PS.char(']'), ipv6addrz.alt(ipvFuture).map(ua => `[${ua}]`) ); function uchar(c: string): PS.Parser<string> { return unreservedChar.alt(escaped).alt(subDelims).alt(PS.oneOf(c.split(''))); } const pchar = uchar(':@'); const regName: PS.Parser<string> = countMinMax(0, 255, nameChar).map(joinStr); const uquery: PS.Parser<string> = PS.many(uchar(':@/?')).map(x => `?${joinStr(x)}`); const ufragment: PS.Parser<string> = PS.many(uchar(':@/?')).map(x => `#${joinStr(x)}`); const host: PS.Parser<string> = ipLiteral.alt(PS.attempt(ipv4address)).alt(regName); const port: PS.Parser<string> = PS.char(':').chain(() => PS.many(PS.anyDigit)).map(xs => `:${joinStr(xs)}`); const segment = PS.many(pchar).map(joinStr); const slashSegment = PS.char('/').chain(() => segment).map(x => `/${x}`); const segmentNz = PS.many1(pchar).map(joinStr); const segmentNzc = PS.many1(uchar('@')).map(joinStr);