import { Effects, PureEffect } from '@typed/effects' import { LoggerEnv } from '@typed/logger' import { Maybe, Nothing } from '@typed/maybe' export interface ArgsEnv extends LoggerEnv { readonly args: readonly string[] } export interface ArgParser { readonly help: () => PureEffect readonly parse: () => Effects> } export type ParseOptions = { readonly aliases?: readonly string[] readonly help?: string } export type ArgParserResult = readonly [ readonly number[], Maybe<{ [K in A]: B }>, ] export type ArgParserResultValue = A extends ArgParserResult ? R : never export namespace ArgParserResult { export const none: ArgParserResult = [[], Nothing] } export type ArgParserNameValue = A extends ArgParser ? { readonly [K in Name]: Value } : never export type ArgParserValue = A extends ArgParser ? Value : never export type ArgParserName = A extends ArgParser ? Name : never