decline-ts
Version:
Composable command-line parser for TypeScript - a (partial) porting of Scala decline using fp-ts
61 lines (60 loc) • 2.96 kB
JavaScript
;
Object.defineProperty(exports, "__esModule", { value: true });
exports.orElse = exports.of = exports.URI = void 0;
const fp_ts_1 = require("fp-ts");
const function_1 = require("fp-ts/function");
const Result_1 = require("../../Result");
const index_1 = require("../index");
const Match_1 = require("../Match");
exports.URI = 'OrElse';
const of = (left, right) => ({
_tag: exports.URI,
left,
right,
});
exports.of = of;
exports.orElse = {
URI: exports.URI,
parseOption: name => fa => {
const left = function_1.pipe(fa.left, index_1.Accumulator.parseOption(name));
const right = function_1.pipe(fa.right, index_1.Accumulator.parseOption(name));
if (fp_ts_1.option.isSome(left) && fp_ts_1.option.isSome(right)) {
const matchLeft = left.value;
const matchRight = right.value;
if (Match_1.Match.isMatchFlag(matchLeft) && Match_1.Match.isMatchFlag(matchRight)) {
return fp_ts_1.option.some(Match_1.Match.matchFlag(exports.of(matchLeft.next, matchRight.next)));
}
if (Match_1.Match.isMatchOption(matchLeft) && Match_1.Match.isMatchOption(matchRight)) {
return fp_ts_1.option.some(Match_1.Match.matchOption(v => exports.of(matchLeft.next(v), matchRight.next(v))));
}
return fp_ts_1.option.some(Match_1.Match.matchAmbiguous);
}
if (fp_ts_1.option.isSome(left) && fp_ts_1.option.isNone(right))
return left;
if (fp_ts_1.option.isNone(left) && fp_ts_1.option.isSome(right))
return right;
return fp_ts_1.option.none;
},
parseArg: arg => fa => fp_ts_1.readonlyNonEmptyArray.concat(function_1.pipe(fa.left, index_1.Accumulator.parseArg(arg)), function_1.pipe(fa.right, index_1.Accumulator.parseArg(arg))),
parseSub: command => fa => {
const resLeft = function_1.pipe(fa.left, index_1.Accumulator.parseSub(command));
const resRight = function_1.pipe(fa.right, index_1.Accumulator.parseSub(command));
if (fp_ts_1.option.isSome(resLeft) && fp_ts_1.option.isSome(resRight)) {
return fp_ts_1.option.some(args => {
const lh = resLeft.value(args);
if (fp_ts_1.either.isLeft(lh))
return lh;
const rh = resRight.value(args);
if (fp_ts_1.either.isLeft(rh))
return rh;
return fp_ts_1.either.right(function_1.pipe(lh.right, Result_1.Result.alt(() => rh.right)));
});
}
if (fp_ts_1.option.isSome(resLeft) && fp_ts_1.option.isNone(resRight))
return resLeft;
if (fp_ts_1.option.isNone(resLeft) && fp_ts_1.option.isSome(resRight))
return resRight;
return fp_ts_1.option.none;
},
result: fa => function_1.pipe(index_1.Accumulator.result(fa.left), Result_1.Result.alt(() => index_1.Accumulator.result(fa.right))),
};