cli-utils-4.1.0
LicenseBSD3
Maintainertbidne@gmail.com
Safe HaskellNone
LanguageHaskell2010

Common.Parsing.Core

Description

Provides functions for parsing String arguments.

Synopsis

Documentation

data AnyParser acc Source #

Existentially quantifies the a in Parser a acc. This way we can accept a heterogenous [AnyParser acc] so we can try different parsers at once.

Constructors

forall a. AnyParser (Parser a acc) 

data Parser a acc Source #

Wraps functions that:

  1. Attempts to parse a String into an a.
  2. Updates acc with a.

That is,

  parseFn :: String -> Maybe a
  updateFn :: acc -> a -> acc

Constructors

ExactParser (String -> Maybe a, acc -> a -> acc)

Parses an exact argument e.g. "-flag".

PrefixParser (String, String -> Maybe a, acc -> a -> acc)

Includes a prefix for parsing e.g. "--arg=val".

parseAll :: Monoid acc => [AnyParser acc] -> [String] -> ParseAnd acc Source #

Entrypoint for parsing arguments [String] into acc. We impose a monoid requirement on the accumulator to take advantage of laziness. Returns

   - Left (Err String): some String could not be parsed by any parser.
   - Left Help: "--help" was found
   - Right acc: every String was parsed successfully by some parser.

In symbols, let P = [AnyParser acc], S = [String] and define \[ p(s) = \begin{cases} 1, &p\text{ parsed } s \text{ successfully.} \\ 0, &\mathrm{otherwise} \end{cases} \] Then, \[ \mathrm{parseAll}(P, S) = \text{Right acc} \iff \forall s \in S, \exists p \in P \text{ such that } p(s) = 1 \]