UNPKG

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