decline-ts
Version:
Composable command-line parser for TypeScript - a (partial) porting of Scala decline using fp-ts
45 lines (44 loc) • 2.94 kB
JavaScript
;
Object.defineProperty(exports, "__esModule", { value: true });
exports.ap = 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 ArgOut_1 = require("../ArgOut");
const index_1 = require("../index");
const Match_1 = require("../Match");
exports.URI = 'Ap';
const of = (left, right) => ({
_tag: exports.URI,
left,
right,
});
exports.of = of;
exports.ap = {
URI: exports.URI,
parseOption: name => (fa) => {
const leftOpt = function_1.pipe(fa.left, index_1.Accumulator.parseOption(name));
const rightOpt = function_1.pipe(fa.right, index_1.Accumulator.parseOption(name));
if (fp_ts_1.option.isSome(leftOpt) && fp_ts_1.option.isNone(rightOpt)) {
return fp_ts_1.option.some(function_1.pipe(leftOpt.value, Match_1.Match.map(v => exports.of(v, fa.right))));
}
if (fp_ts_1.option.isNone(leftOpt) && fp_ts_1.option.isSome(rightOpt)) {
return fp_ts_1.option.some(function_1.pipe(rightOpt.value, Match_1.Match.map(v => exports.of(fa.left, v))));
}
if (fp_ts_1.option.isNone(leftOpt) && fp_ts_1.option.isNone(rightOpt))
return fp_ts_1.option.none;
return fp_ts_1.option.some(Match_1.Match.matchAmbiguous);
},
parseArg: arg => (fa) => {
const parsedRight = ArgOut_1.ArgOut.squish(function_1.pipe(fa.right, index_1.Accumulator.parseArg(arg)));
return function_1.pipe(ArgOut_1.ArgOut.squish(function_1.pipe(fa.left, index_1.Accumulator.parseArg(arg))), fp_ts_1.readonlyNonEmptyArray.chain(
// Left side can't accept the argument: try the right
fp_ts_1.either.fold(newLeft => function_1.pipe(parsedRight, fp_ts_1.readonlyNonEmptyArray.map(fp_ts_1.either.bimap(newRight => exports.of(newLeft, newRight), newRight => exports.of(newLeft, newRight)))), newLeft => fp_ts_1.readonlyNonEmptyArray.of(fp_ts_1.either.right(exports.of(newLeft, fa.right))))));
},
parseSub: command => fa => {
const leftSub = function_1.pipe(fa.left, index_1.Accumulator.parseSub(command), fp_ts_1.option.map(parser => function_1.flow(parser, fp_ts_1.either.map(leftResult => function_1.pipe(fp_ts_1.apply.sequenceT(Result_1.Result.result)(leftResult, index_1.Accumulator.result(fa.right)), Result_1.Result.map(([f, a]) => f(a)))))));
const rightSub = function_1.pipe(fa.right, index_1.Accumulator.parseSub(command), fp_ts_1.option.map(parser => function_1.flow(parser, fp_ts_1.either.map(rightResult => function_1.pipe(fp_ts_1.apply.sequenceT(Result_1.Result.result)(index_1.Accumulator.result(fa.left), rightResult), Result_1.Result.map(([f, a]) => f(a)))))));
return function_1.pipe(leftSub, fp_ts_1.option.alt(() => rightSub));
},
result: fa => function_1.pipe(index_1.Accumulator.result(fa.right), Result_1.Result.ap(index_1.Accumulator.result(fa.left))),
};