UNPKG

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
"use strict"; 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))), };