import { uniq } from '@typed/list'
import { fromJust, isNothing, Just, map, Maybe, Nothing } from '@typed/maybe'
import { createParser } from './createParser'
import { getPositionalArgumentValue } from './getPositionalArgumentValue'
import { ArgParser, ArgParserResult, ParseOptions } from './types'
export function parseNumberArg(
name: A,
options: ParseOptions = {},
): ArgParser {
return createParser(name, options, (index, args) => {
const [valueIndex, value] = parseNumberArgByPosition(index, args)
const indexesUsed = uniq([index, valueIndex])
const result: ArgParserResult = [
indexesUsed,
map((value) => ({ [name]: value } as { [K in A]: number }), value),
]
return result
})
}
function parseNumberArgByPosition(
index: number,
args: readonly string[],
): readonly [number, Maybe] {
const positionalArg = getPositionalArgumentValue(index, args)
if (isNothing(positionalArg)) {
return [index, Nothing]
}
const [valueIndex, arg] = fromJust(positionalArg)
const value = parseFloat(arg)
return [valueIndex, Number.isNaN(value) ? Nothing : Just.of(value)]
}