mangrove-cli 0.1.0.0 → 0.2.0.0
raw patch · 12 files changed
+86/−58 lines, 12 filesdep ~containersdep ~hspecdep ~mtlPVP ok
version bump matches the API change (PVP)
Dependency ranges changed: containers, hspec, mtl, text, transformers
API changes (from Hackage documentation)
- Mangrove: instance GHC.Internal.Classes.Eq r => GHC.Internal.Classes.Eq (Mangrove.Result s r)
- Mangrove: instance GHC.Internal.Show.Show Mangrove.ProgramInfo
- Mangrove: instance GHC.Internal.Show.Show r => GHC.Internal.Show.Show (Mangrove.Result s r)
- Mangrove.Parser: instance GHC.Internal.Base.Alternative (Mangrove.Parser.StreamParser s)
- Mangrove.Parser: instance GHC.Internal.Base.Applicative (Mangrove.Parser.StreamParser s)
- Mangrove.Parser: instance GHC.Internal.Base.Functor (Mangrove.Parser.HelpContinuation 'Mangrove.Parser.Helpful s)
- Mangrove.Parser: instance GHC.Internal.Base.Functor (Mangrove.Parser.HelpContinuation 'Mangrove.Parser.Silent s)
- Mangrove.Parser: instance GHC.Internal.Base.Functor (Mangrove.Parser.StreamParser s)
- Mangrove.Parser: instance GHC.Internal.Base.Functor p => GHC.Internal.Base.Alternative (Mangrove.Parser.ParseTree p)
- Mangrove.Parser: instance GHC.Internal.Base.Functor p => GHC.Internal.Base.Applicative (Mangrove.Parser.ParseTree p)
- Mangrove.Parser: instance GHC.Internal.Base.Functor p => GHC.Internal.Base.Functor (Mangrove.Parser.ParseTree p)
- Mangrove.Parser: instance GHC.Internal.Base.Monad (Mangrove.Parser.StreamParser s)
- Mangrove.Parser: instance Mangrove.Parser.Scheme s => GHC.Internal.Classes.Eq (Mangrove.Parser.StreamState s)
- Mangrove.Parser: instance Mangrove.Parser.Scheme s => GHC.Internal.Show.Show (Mangrove.Parser.StreamState s)
- Mangrove.Resolve: instance GHC.Internal.Base.Alternative Mangrove.Resolve.ResolveM
- Mangrove.Resolve: instance GHC.Internal.Base.Applicative Mangrove.Resolve.ResolveM
- Mangrove.Resolve: instance GHC.Internal.Base.Functor Mangrove.Resolve.ResolveM
- Mangrove.Resolve: instance GHC.Internal.Base.Monad Mangrove.Resolve.ResolveM
- Mangrove.Scheme.Sub: instance GHC.Internal.Base.Functor Mangrove.Scheme.Sub.SubScheme
- Mangrove.Scheme.Sub: instance GHC.Internal.Classes.Eq (Mangrove.Parser.Token Mangrove.Scheme.Sub.SubScheme)
- Mangrove.Scheme.Sub: instance GHC.Internal.Show.Show (Mangrove.Parser.Token Mangrove.Scheme.Sub.SubScheme)
- Mangrove.Scheme.Unix: instance GHC.Internal.Base.Functor Mangrove.Scheme.Unix.UnixScheme
- Mangrove.Scheme.Unix: instance GHC.Internal.Classes.Eq (Mangrove.Parser.Token Mangrove.Scheme.Unix.UnixScheme)
- Mangrove.Scheme.Unix: instance GHC.Internal.Classes.Eq Mangrove.Scheme.Unix.CommandInfo
- Mangrove.Scheme.Unix: instance GHC.Internal.Classes.Eq Mangrove.Scheme.Unix.Flag
- Mangrove.Scheme.Unix: instance GHC.Internal.Classes.Eq Mangrove.Scheme.Unix.OptionHelp
- Mangrove.Scheme.Unix: instance GHC.Internal.Classes.Eq Mangrove.Scheme.Unix.OptionInfo
- Mangrove.Scheme.Unix: instance GHC.Internal.Classes.Ord Mangrove.Scheme.Unix.CommandInfo
- Mangrove.Scheme.Unix: instance GHC.Internal.Classes.Ord Mangrove.Scheme.Unix.Flag
- Mangrove.Scheme.Unix: instance GHC.Internal.Classes.Ord Mangrove.Scheme.Unix.OptionHelp
- Mangrove.Scheme.Unix: instance GHC.Internal.Classes.Ord Mangrove.Scheme.Unix.OptionInfo
- Mangrove.Scheme.Unix: instance GHC.Internal.Data.String.IsString Mangrove.Scheme.Unix.Flag
- Mangrove.Scheme.Unix: instance GHC.Internal.Show.Show (Mangrove.Parser.Token Mangrove.Scheme.Unix.UnixScheme)
- Mangrove.Scheme.Unix: instance GHC.Internal.Show.Show Mangrove.Scheme.Unix.CommandInfo
- Mangrove.Scheme.Unix: instance GHC.Internal.Show.Show Mangrove.Scheme.Unix.Flag
- Mangrove.Scheme.Unix: instance GHC.Internal.Show.Show Mangrove.Scheme.Unix.OptionHelp
- Mangrove.Scheme.Unix: instance GHC.Internal.Show.Show Mangrove.Scheme.Unix.OptionInfo
- Mangrove.Separable: instance GHC.Internal.Base.Applicative Mangrove.Separable.Modal
- Mangrove.Separable: instance GHC.Internal.Base.Functor Mangrove.Separable.Exhibit
- Mangrove.Separable: instance GHC.Internal.Base.Functor Mangrove.Separable.Modal
- Mangrove.Text: instance Mangrove.Text.Render GHC.Internal.Base.String
- Mangrove.Text: instance Mangrove.Text.Render GHC.Internal.Types.Char
- Mangrove.TextParser: instance GHC.Internal.Base.Functor Mangrove.TextParser.TextParser
- Mangrove.TextParser: instance Mangrove.TextParser.DefaultParser GHC.Internal.Base.String
- Mangrove.TextParser: instance Mangrove.TextParser.DefaultParser GHC.Internal.Bignum.Integer.Integer
- Mangrove.TextParser: instance Mangrove.TextParser.DefaultParser GHC.Internal.Types.Bool
- Mangrove.TextParser: instance Mangrove.TextParser.DefaultParser GHC.Internal.Types.Char
- Mangrove.TextParser: instance Mangrove.TextParser.DefaultParser GHC.Internal.Types.Double
- Mangrove.TextParser: instance Mangrove.TextParser.DefaultParser GHC.Internal.Types.Float
- Mangrove.TextParser: instance Mangrove.TextParser.DefaultParser GHC.Internal.Types.Int
- Mangrove.TextParser: instance Mangrove.TextParser.DefaultParser GHC.Internal.Types.Word
+ Mangrove: instance GHC.Classes.Eq r => GHC.Classes.Eq (Mangrove.Result s r)
+ Mangrove: instance GHC.Show.Show Mangrove.ProgramInfo
+ Mangrove: instance GHC.Show.Show r => GHC.Show.Show (Mangrove.Result s r)
+ Mangrove.Parser: instance GHC.Base.Alternative (Mangrove.Parser.StreamParser s)
+ Mangrove.Parser: instance GHC.Base.Applicative (Mangrove.Parser.StreamParser s)
+ Mangrove.Parser: instance GHC.Base.Functor (Mangrove.Parser.HelpContinuation 'Mangrove.Parser.Helpful s)
+ Mangrove.Parser: instance GHC.Base.Functor (Mangrove.Parser.HelpContinuation 'Mangrove.Parser.Silent s)
+ Mangrove.Parser: instance GHC.Base.Functor (Mangrove.Parser.StreamParser s)
+ Mangrove.Parser: instance GHC.Base.Functor p => GHC.Base.Alternative (Mangrove.Parser.ParseTree p)
+ Mangrove.Parser: instance GHC.Base.Functor p => GHC.Base.Applicative (Mangrove.Parser.ParseTree p)
+ Mangrove.Parser: instance GHC.Base.Functor p => GHC.Base.Functor (Mangrove.Parser.ParseTree p)
+ Mangrove.Parser: instance GHC.Base.Monad (Mangrove.Parser.StreamParser s)
+ Mangrove.Parser: instance Mangrove.Parser.Scheme s => GHC.Classes.Eq (Mangrove.Parser.StreamState s)
+ Mangrove.Parser: instance Mangrove.Parser.Scheme s => GHC.Show.Show (Mangrove.Parser.StreamState s)
+ Mangrove.Resolve: instance GHC.Base.Alternative Mangrove.Resolve.ResolveM
+ Mangrove.Resolve: instance GHC.Base.Applicative Mangrove.Resolve.ResolveM
+ Mangrove.Resolve: instance GHC.Base.Functor Mangrove.Resolve.ResolveM
+ Mangrove.Resolve: instance GHC.Base.Monad Mangrove.Resolve.ResolveM
+ Mangrove.Scheme.Sub: instance GHC.Base.Functor Mangrove.Scheme.Sub.SubScheme
+ Mangrove.Scheme.Sub: instance GHC.Classes.Eq (Mangrove.Parser.Token Mangrove.Scheme.Sub.SubScheme)
+ Mangrove.Scheme.Sub: instance GHC.Show.Show (Mangrove.Parser.Token Mangrove.Scheme.Sub.SubScheme)
+ Mangrove.Scheme.Unix: instance Data.String.IsString Mangrove.Scheme.Unix.Flag
+ Mangrove.Scheme.Unix: instance GHC.Base.Functor Mangrove.Scheme.Unix.UnixScheme
+ Mangrove.Scheme.Unix: instance GHC.Classes.Eq (Mangrove.Parser.Token Mangrove.Scheme.Unix.UnixScheme)
+ Mangrove.Scheme.Unix: instance GHC.Classes.Eq Mangrove.Scheme.Unix.CommandInfo
+ Mangrove.Scheme.Unix: instance GHC.Classes.Eq Mangrove.Scheme.Unix.Flag
+ Mangrove.Scheme.Unix: instance GHC.Classes.Eq Mangrove.Scheme.Unix.OptionHelp
+ Mangrove.Scheme.Unix: instance GHC.Classes.Eq Mangrove.Scheme.Unix.OptionInfo
+ Mangrove.Scheme.Unix: instance GHC.Classes.Ord Mangrove.Scheme.Unix.CommandInfo
+ Mangrove.Scheme.Unix: instance GHC.Classes.Ord Mangrove.Scheme.Unix.Flag
+ Mangrove.Scheme.Unix: instance GHC.Classes.Ord Mangrove.Scheme.Unix.OptionHelp
+ Mangrove.Scheme.Unix: instance GHC.Classes.Ord Mangrove.Scheme.Unix.OptionInfo
+ Mangrove.Scheme.Unix: instance GHC.Show.Show (Mangrove.Parser.Token Mangrove.Scheme.Unix.UnixScheme)
+ Mangrove.Scheme.Unix: instance GHC.Show.Show Mangrove.Scheme.Unix.CommandInfo
+ Mangrove.Scheme.Unix: instance GHC.Show.Show Mangrove.Scheme.Unix.Flag
+ Mangrove.Scheme.Unix: instance GHC.Show.Show Mangrove.Scheme.Unix.OptionHelp
+ Mangrove.Scheme.Unix: instance GHC.Show.Show Mangrove.Scheme.Unix.OptionInfo
+ Mangrove.Separable: instance GHC.Base.Applicative Mangrove.Separable.Modal
+ Mangrove.Separable: instance GHC.Base.Functor Mangrove.Separable.Exhibit
+ Mangrove.Separable: instance GHC.Base.Functor Mangrove.Separable.Modal
+ Mangrove.Text: instance Mangrove.Text.Render GHC.Base.String
+ Mangrove.Text: instance Mangrove.Text.Render GHC.Types.Char
+ Mangrove.TextParser: instance GHC.Base.Functor Mangrove.TextParser.TextParser
+ Mangrove.TextParser: instance Mangrove.TextParser.DefaultParser GHC.Base.String
+ Mangrove.TextParser: instance Mangrove.TextParser.DefaultParser GHC.Num.Integer.Integer
+ Mangrove.TextParser: instance Mangrove.TextParser.DefaultParser GHC.Types.Bool
+ Mangrove.TextParser: instance Mangrove.TextParser.DefaultParser GHC.Types.Char
+ Mangrove.TextParser: instance Mangrove.TextParser.DefaultParser GHC.Types.Double
+ Mangrove.TextParser: instance Mangrove.TextParser.DefaultParser GHC.Types.Float
+ Mangrove.TextParser: instance Mangrove.TextParser.DefaultParser GHC.Types.Int
+ Mangrove.TextParser: instance Mangrove.TextParser.DefaultParser GHC.Types.Word
- Mangrove: ProgramInfo :: Text -> Text -> ProgramInfo
+ Mangrove: ProgramInfo :: !Text -> !Text -> ProgramInfo
- Mangrove: [Failure] :: forall (s :: Type -> Type) r. Text -> Result s r
+ Mangrove: [Failure] :: forall (s :: Type -> Type) r. !Text -> Result s r
- Mangrove: [Help] :: forall (s :: Type -> Type) r. SupportsHelp s => Text -> Result s r
+ Mangrove: [Help] :: forall (s :: Type -> Type) r. SupportsHelp s => !Text -> Result s r
- Mangrove: [Success] :: forall r (s :: Type -> Type). [Text] -> r -> Result s r
+ Mangrove: [Success] :: forall r (s :: Type -> Type). ![Text] -> !r -> Result s r
- Mangrove: [programDesc] :: ProgramInfo -> Text
+ Mangrove: [programDesc] :: ProgramInfo -> !Text
- Mangrove: [programName] :: ProgramInfo -> Text
+ Mangrove: [programName] :: ProgramInfo -> !Text
- Mangrove.Parser: StreamState :: [Text] -> [Token s] -> Bool -> StreamState (s :: Type -> Type)
+ Mangrove.Parser: StreamState :: ![Text] -> ![Token s] -> !Bool -> StreamState (s :: Type -> Type)
- Mangrove.Parser: [ManyNode] :: forall (scheme :: Type -> Type) r1. Bool -> ParseTree scheme r1 -> ParseTree scheme [r1]
+ Mangrove.Parser: [ManyNode] :: forall (scheme :: Type -> Type) r1. !Bool -> ParseTree scheme r1 -> ParseTree scheme [r1]
- Mangrove.Parser: [ProdNode] :: forall u v r (scheme :: Type -> Type). (u -> v -> r) -> ParseTree scheme u -> ParseTree scheme v -> ParseTree scheme r
+ Mangrove.Parser: [ProdNode] :: forall u v r (scheme :: Type -> Type). !u -> v -> r -> ParseTree scheme u -> ParseTree scheme v -> ParseTree scheme r
- Mangrove.Parser: [ValueNode] :: forall r (scheme :: Type -> Type). r -> ParseTree scheme r
+ Mangrove.Parser: [ValueNode] :: forall r (scheme :: Type -> Type). !r -> ParseTree scheme r
- Mangrove.Parser: [streamContent] :: StreamState (s :: Type -> Type) -> [Text]
+ Mangrove.Parser: [streamContent] :: StreamState (s :: Type -> Type) -> ![Text]
- Mangrove.Parser: [streamContext] :: StreamState (s :: Type -> Type) -> [Token s]
+ Mangrove.Parser: [streamContext] :: StreamState (s :: Type -> Type) -> ![Token s]
- Mangrove.Parser: [streamEscaped] :: StreamState (s :: Type -> Type) -> Bool
+ Mangrove.Parser: [streamEscaped] :: StreamState (s :: Type -> Type) -> !Bool
- Mangrove.Resolve: ExpectedError :: [Builder] -> ResolveM a
+ Mangrove.Resolve: ExpectedError :: ![Builder] -> ResolveM a
- Mangrove.Resolve: Value :: a -> ResolveM a
+ Mangrove.Resolve: Value :: !a -> ResolveM a
- Mangrove.Scheme.Sub: Option :: Text -> TextParser r -> SubScheme r
+ Mangrove.Scheme.Sub: Option :: !Text -> TextParser r -> SubScheme r
- Mangrove.Scheme.Unix: Command :: CommandInfo -> ParseTree UnixScheme r -> UnixScheme r
+ Mangrove.Scheme.Unix: Command :: !CommandInfo -> ParseTree UnixScheme r -> UnixScheme r
- Mangrove.Scheme.Unix: CommandInfo :: NonEmpty Text -> Text -> CommandInfo
+ Mangrove.Scheme.Unix: CommandInfo :: !NonEmpty Text -> !Text -> CommandInfo
- Mangrove.Scheme.Unix: HelpOption :: OptionInfo -> UnixScheme r
+ Mangrove.Scheme.Unix: HelpOption :: !OptionInfo -> UnixScheme r
- Mangrove.Scheme.Unix: LongFlag :: Text -> Flag
+ Mangrove.Scheme.Unix: LongFlag :: !Text -> Flag
- Mangrove.Scheme.Unix: Option :: OptionInfo -> ParseTree SubScheme r -> UnixScheme r
+ Mangrove.Scheme.Unix: Option :: !OptionInfo -> ParseTree SubScheme r -> UnixScheme r
- Mangrove.Scheme.Unix: OptionInfo :: NonEmpty Flag -> Text -> OptionInfo
+ Mangrove.Scheme.Unix: OptionInfo :: !NonEmpty Flag -> !Text -> OptionInfo
- Mangrove.Scheme.Unix: ShortFlag :: Char -> Flag
+ Mangrove.Scheme.Unix: ShortFlag :: !Char -> Flag
- Mangrove.Scheme.Unix: [cmdHelp] :: CommandInfo -> Text
+ Mangrove.Scheme.Unix: [cmdHelp] :: CommandInfo -> !Text
- Mangrove.Scheme.Unix: [cmdNames] :: CommandInfo -> NonEmpty Text
+ Mangrove.Scheme.Unix: [cmdNames] :: CommandInfo -> !NonEmpty Text
- Mangrove.Scheme.Unix: [optFlags] :: OptionInfo -> NonEmpty Flag
+ Mangrove.Scheme.Unix: [optFlags] :: OptionInfo -> !NonEmpty Flag
- Mangrove.Scheme.Unix: [optHelp] :: OptionInfo -> Text
+ Mangrove.Scheme.Unix: [optHelp] :: OptionInfo -> !Text
- Mangrove.Separable: Modal :: Bool -> a -> Modal a
+ Mangrove.Separable: Modal :: !Bool -> a -> Modal a
- Mangrove.TextParser: TextParser :: Text -> (Text -> Either Builder r) -> TextParser r
+ Mangrove.TextParser: TextParser :: !Text -> (Text -> Either Text r) -> TextParser r
- Mangrove.TextParser: [parserHint] :: TextParser r -> Text
+ Mangrove.TextParser: [parserHint] :: TextParser r -> !Text
- Mangrove.TextParser: [parserRun] :: TextParser r -> Text -> Either Builder r
+ Mangrove.TextParser: [parserRun] :: TextParser r -> Text -> Either Text r
- Mangrove.Unix: LongFlag :: Text -> Flag
+ Mangrove.Unix: LongFlag :: !Text -> Flag
- Mangrove.Unix: ShortFlag :: Char -> Flag
+ Mangrove.Unix: ShortFlag :: !Char -> Flag
- Mangrove.Unix: TextParser :: Text -> (Text -> Either Builder r) -> TextParser r
+ Mangrove.Unix: TextParser :: !Text -> (Text -> Either Text r) -> TextParser r
- Mangrove.Unix: [parserHint] :: TextParser r -> Text
+ Mangrove.Unix: [parserHint] :: TextParser r -> !Text
- Mangrove.Unix: [parserRun] :: TextParser r -> Text -> Either Builder r
+ Mangrove.Unix: [parserRun] :: TextParser r -> Text -> Either Text r
Files
- CHANGELOG.md +16/−0
- README.md +13/−1
- mangrove-cli.cabal +12/−10
- src/Mangrove.hs +5/−10
- src/Mangrove/Parser.hs +6/−6
- src/Mangrove/Resolve.hs +2/−2
- src/Mangrove/Scheme/Sub.hs +1/−1
- src/Mangrove/Scheme/Unix.hs +15/−13
- src/Mangrove/Separable.hs +4/−4
- src/Mangrove/TextParser.hs +10/−9
- src/Mangrove/Unix.hs +1/−1
- test/Mangrove/ParserSpec.hs +1/−1
CHANGELOG.md view
@@ -8,6 +8,22 @@ ## Unreleased +## 0.2.0.0 - 2026-08-14++### Added++- Documentation about where to obtain this library++### Changed++- Loosen bounds on dependency versions so the project can be built+ against a wider range of snapshots+- Change the error message type for TextParsers from 'Builder' to 'Text'+- Fix missing help options in help output+- Fix unit test builds when using cabal+- Make minor code quality improvements+- Add strictness annotations to simple values in constructors+ ## 0.1.0.0 - 2026-08-12 ### Added
README.md view
@@ -1,5 +1,6 @@-# Mangrove+# Mangrove (mangrove-cli) +[](https://hackage.haskell.org/package/mangrove-cli) [](https://github.com/quytelda/mangrove/actions/workflows/unit-tests.yml) Mangrove is a library for building command line argument parsers using@@ -8,6 +9,17 @@ and commands, as well as complex subparameters and suboptions (e.g. `--mount src=/webroot,dst=/var/www,rw`). It is also extensible, so you can define alternative command line syntaxes.++## Obtaining++Mangrove is available on Hackage as `mangrove-cli`:+<https://hackage.haskell.org/package/mangrove-cli>++__NOTE__: This project is not related to the `mangrove` package on+Hackage. Make sure to use the package name `mangrove-cli`.++The source code for Mangrove is hosted on GitHub:+<https://github.com/quytelda/mangrove> ## Building
mangrove-cli.cabal view
@@ -5,7 +5,7 @@ -- see: https://github.com/sol/hpack name: mangrove-cli-version: 0.1.0.0+version: 0.2.0.0 synopsis: Build CLI argument parsers using Applicative. description: Please see the README on GitHub at <https://github.com/quytelda/mangrove#readme> category: CLI, Options, Parsing@@ -46,10 +46,10 @@ ghc-options: -Wall -Wcompat -Widentities -Wincomplete-record-updates -Wincomplete-uni-patterns -Wmissing-export-lists -Wmissing-home-modules -Wpartial-fields -Wredundant-constraints build-depends: base >=4.7 && <5- , containers >=0.6.7 && <0.9- , mtl >=2.3.1 && <2.4- , text >=2.0.2 && <2.2- , transformers >=0.6.1 && <0.7+ , containers >=0.6.4 && <0.9+ , mtl >=2.2.2 && <2.4+ , text >=1.2.5 && <2.2+ , transformers >=0.5.6 && <0.7 default-language: Haskell2010 test-suite mangrove-cli-test@@ -66,12 +66,14 @@ hs-source-dirs: test ghc-options: -Wall -Wcompat -Widentities -Wincomplete-record-updates -Wincomplete-uni-patterns -Wmissing-export-lists -Wmissing-home-modules -Wpartial-fields -Wredundant-constraints -threaded -rtsopts -with-rtsopts=-N+ build-tool-depends:+ hspec-discover:hspec-discover >=2.8.5 && <3 build-depends: base >=4.7 && <5- , containers >=0.6.7 && <0.9- , hspec >=2.9 && <3+ , containers >=0.6.4 && <0.9+ , hspec >=2.8.5 && <3 , mangrove-cli- , mtl >=2.3.1 && <2.4- , text >=2.0.2 && <2.2- , transformers >=0.6.1 && <0.7+ , mtl >=2.2.2 && <2.4+ , text >=1.2.5 && <2.2+ , transformers >=0.5.6 && <0.7 default-language: Haskell2010
src/Mangrove.hs view
@@ -75,7 +75,7 @@ deriving instance Show r => Show (Result s r) deriving instance Eq r => Eq (Result s r) --- | Create a default initial 'StreamState' from a list of arguments.+-- | Create a default initial t'StreamState' from a list of arguments. argsToState :: [Text] -> StreamState s argsToState args = StreamState args [] False @@ -89,7 +89,7 @@ runSilentParser tree = runSilentParser' tree . argsToState -- | A more general form of 'runSilentParser' that accepts a custom--- 'StreamState' as the starting state.+-- stream starting state. runSilentParser' :: (Scheme s, HelpSupport s ~ 'Silent) => ParseTree s r -- ^ Argument parser@@ -109,7 +109,7 @@ runHelpfulParser info tree = runHelpfulParser' info tree . argsToState -- | A more general form of 'runHelpfulParser' that accepts a custom--- 'StreamState' as the starting state.+-- stream starting state. runHelpfulParser' :: SupportsHelp s => ProgramInfo -- ^ Program metadata@@ -171,15 +171,10 @@ -> (Text -> a) -- ^ Failure handler -> HelpHandler s a -- ^ Help request handler -> a-runArgumentParser tree args =- runArgumentParser' tree StreamState- { streamContent = args- , streamContext = []- , streamEscaped = False- }+runArgumentParser tree = runArgumentParser' tree . argsToState -- | A more general form of 'runArgumentParser' that accepts a custom--- 'StreamState' as the starting state.+-- stream starting state. runArgumentParser' :: Scheme s => ParseTree s r -- ^ Argument parser
src/Mangrove/Parser.hs view
@@ -101,15 +101,15 @@ -- | Terminal node with no value (abstracts 'empty') EmptyNode :: ParseTree scheme r -- | A terminal node with a resolved value (abstracts 'pure')- ValueNode :: r -> ParseTree scheme r+ ValueNode :: !r -> ParseTree scheme r -- | A parser awaiting input ParseNode :: scheme r -> ParseTree scheme r -- | Abstracts 'liftA2' and by extension '(<*>)'- ProdNode :: (u -> v -> r) -> ParseTree scheme u -> ParseTree scheme v -> ParseTree scheme r+ ProdNode :: !(u -> v -> r) -> ParseTree scheme u -> ParseTree scheme v -> ParseTree scheme r -- | Abstracts '(<|>)' SumNode :: ParseTree scheme r -> ParseTree scheme r -> ParseTree scheme r -- | Abstracts 'many' (@MaybeNode False@) and 'some' (@MaybeNode True@)- ManyNode :: Bool -> ParseTree scheme r -> ParseTree scheme [r]+ ManyNode :: !Bool -> ParseTree scheme r -> ParseTree scheme [r] instance Functor p => Functor (ParseTree p) where fmap _ EmptyNode = EmptyNode@@ -319,9 +319,9 @@ -- arguments to be interpreted as positional arguments, even if they -- would normally be interpreted as options or commands. data StreamState s = StreamState- { streamContent :: [Text] -- ^ A sequence of 'Text' values- , streamContext :: [Token s] -- ^ A stack representing current parsing context- , streamEscaped :: Bool -- ^ Escaped mode+ { streamContent :: ![Text] -- ^ A sequence of 'Text' values+ , streamContext :: ![Token s] -- ^ A stack representing current parsing context+ , streamEscaped :: !Bool -- ^ Escaped mode } deriving instance Scheme s => Show (StreamState s)
src/Mangrove/Resolve.hs view
@@ -29,8 +29,8 @@ -- and didn't find it, and (2) the parser resolved to an empty value. data ResolveM a = EmptyError- | ExpectedError [Builder]- | Value a+ | ExpectedError ![Builder]+ | Value !a deriving (Functor) instance Applicative ResolveM where
src/Mangrove/Scheme/Sub.hs view
@@ -34,7 +34,7 @@ -- | Parsers for subarguments of an option (e.g. @--option key=value@). data SubScheme r = Parameter (TextParser r) -- ^ Parses freeform arguments- | Option Text (TextParser r) -- ^ Suboptions have the form "KEY=VALUE"+ | Option !Text (TextParser r) -- ^ Suboptions have the form "KEY=VALUE" deriving (Functor) instance Valency SubScheme where
src/Mangrove/Scheme/Unix.hs view
@@ -68,8 +68,8 @@ -- Thus, you can write @"--flop"@ instead of @LongFlag "flop"@ and -- @"-c"@ instead of @ShortFlag \'c\'@. data Flag- = LongFlag Text- | ShortFlag Char+ = LongFlag !Text+ | ShortFlag !Char deriving (Eq, Ord, Show) instance IsString Flag where@@ -85,8 +85,8 @@ -- | A description of a CLI option. data OptionInfo = OptionInfo- { optFlags :: NonEmpty Flag -- ^ A list of flags that trigger this option.- , optHelp :: Text -- ^ A description displayed in help output.+ { optFlags :: !(NonEmpty Flag) -- ^ A list of flags that trigger this option.+ , optHelp :: !Text -- ^ A description displayed in help output. } deriving (Eq, Ord, Show) -- | Get a representative flag for this option (e.g. the first one).@@ -95,8 +95,8 @@ -- | A description of a CLI command. data CommandInfo = CommandInfo- { cmdNames :: NonEmpty Text -- ^ Command Names- , cmdHelp :: Text -- ^ A description displayed in help output.+ { cmdNames :: !(NonEmpty Text) -- ^ Command Names+ , cmdHelp :: !Text -- ^ A description displayed in help output. } deriving (Eq, Ord, Show) -- | Get a representative command name for this command (e.g. the@@ -109,11 +109,11 @@ -- | A freeform positional parameter = Parameter (TextParser r) -- | A subcommand with its own parse tree- | Command CommandInfo (ParseTree UnixScheme r)+ | Command !CommandInfo (ParseTree UnixScheme r) -- | A named option that might support suboptions- | Option OptionInfo (ParseTree SubScheme r)+ | Option !OptionInfo (ParseTree SubScheme r) -- | A special option that requests help information- | HelpOption OptionInfo+ | HelpOption !OptionInfo deriving (Functor) instance Valency UnixScheme where@@ -344,10 +344,10 @@ go node = node data OptionHelp = OptionHelp- { colShorts :: TL.Text -- Column 1- , colLongs :: TL.Text -- Column 2- , colArg :: TL.Text -- Column 3- , colDesc :: TL.Text -- Column 4+ { colShorts :: !TL.Text -- Column 1+ , colLongs :: !TL.Text -- Column 2+ , colArg :: !TL.Text -- Column 3+ , colDesc :: !TL.Text -- Column 4 } deriving (Eq, Ord, Show) makeOptionHelp :: OptionInfo -> ParseTree SubScheme r -> OptionHelp@@ -376,6 +376,8 @@ -> Map [CommandInfo] [OptionHelp] go (ParseNode (Option info subtree)) = Map.insertWith (<>) [] [makeOptionHelp info subtree]+ go (ParseNode (HelpOption info)) =+ Map.insertWith (<>) [] [makeOptionHelp info empty] go (ParseNode (Command info subtree)) = Map.union $ Map.mapKeys (info :) $ collectOptions subtree go (ProdNode _ l r) = go r . go l
src/Mangrove/Separable.hs view
@@ -24,7 +24,7 @@ -- input. This can happen because the parsing context changed (for -- example, when a command is recognized) or when the parsing is -- exited entirely (for example, when a help option is encountered).-data Modal a = Modal Bool a+data Modal a = Modal !Bool a deriving (Functor) instance Applicative Modal where@@ -39,7 +39,7 @@ usesTerseOutput :: Modal a -> Bool usesTerseOutput (Modal terseOutput _) = terseOutput --- | An 'Exhibit' represents an object whose modal sub-components have+-- | A representation of an object whose modal sub-components have -- been split off for the purpose of better help output. -- -- Every parser and parse tree can be decomposed into one regular tree@@ -47,7 +47,7 @@ data Exhibit a = Exhibit (Maybe a) [Modal a] deriving (Functor) --- | Convert an 'Exhibit' to a regular list of regular and modal+-- | Convert an t'Exhibit' to a regular list of regular and modal -- components. exhibitToList :: Exhibit a -> [a] exhibitToList (Exhibit mnorm modals) =@@ -61,7 +61,7 @@ -- significantly easier to read. -- -- NOTE: Decomposed subparsers are intended for display purposes--- (hence the 'Exhibit' type). Trying to parse input with them is+-- (hence the t'Exhibit' type). Trying to parse input with them is -- likely to fail. class Functor s => Separable (s :: Type -> Type) where separate :: s r -> Exhibit (s r)
src/Mangrove/TextParser.hs view
@@ -21,6 +21,7 @@ ) where import Control.Monad.Except+import Data.Bifunctor import Data.Text (Text) import qualified Data.Text as T import qualified Data.Text.Lazy.Builder as TLB@@ -28,31 +29,31 @@ import Mangrove.Text --- | A 'TextParser' is the most atomic client-defined parsing unit. It+-- | A @TextParser@ is the most basic client-defined parsing unit. It -- parses textual data that is not otherwise part of the parsing -- scheme into the actual results that will be combined and returned -- once parsing completes. data TextParser r = TextParser- { parserHint :: Text -- ^ A hint about the type of input this parser expects- , parserRun :: Text -> Either Builder r -- ^ An actual parsing function+ { parserHint :: !Text -- ^ A hint about the type of input this parser expects+ , parserRun :: Text -> Either Text r -- ^ An actual parsing function } deriving (Functor) --- | Lift a 'TextParser' into some 'MonadError'.+-- | A more general function for running t'TextParser's. runTextParser :: MonadError Builder m => TextParser r -> Text -> m r-runTextParser tp = liftEither . parserRun tp+runTextParser tp = liftEither . first TLB.fromText . parserRun tp -- | A typeclass for types that have a convenient default--- 'TextParser'.+-- t'TextParser' implementation. class DefaultParser r where -- | A reasonable default TextParser implementation. defaultParser :: TextParser r -exactly :: TR.Reader a -> Text -> Either Builder a+exactly :: TR.Reader a -> Text -> Either Text a exactly reader text = case reader text of- Left err -> throwError $ TLB.fromString err+ Left err -> throwError $ T.pack err Right (result, "") -> pure result- Right (_, leftover) -> throwError $ "unexpected input: " <> render leftover+ Right (_, leftover) -> throwError $ "unexpected input: " <> leftover instance DefaultParser Bool where defaultParser = TextParser
src/Mangrove/Unix.hs view
@@ -45,7 +45,7 @@ -------------------------------------------------------------------------------- -- Tree-building Combinators --- | Create a parameter parser from a 'TextParser'.+-- | Create a parameter parser from a t'TextParser'. parameter :: TextParser r -> UnixParser r
test/Mangrove/ParserSpec.hs view
@@ -174,6 +174,6 @@ let (finalState, result) = runStreamParser' pop (initState_singleton @UnixScheme) it "gets the first item without replacement" $ do result `shouldBe` SSuccess "asdf"- streamContent finalState `shouldBe` tail (streamContent initState_singleton)+ streamContent finalState `shouldBe` drop 1 (streamContent initState_singleton) it "preserves the context" $ do streamContext initState_singleton `shouldBe` streamContext finalState