packages feed

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 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) +[![Hackage](https://img.shields.io/hackage/v/mangrove-cli.svg)](https://hackage.haskell.org/package/mangrove-cli) [![Unit Tests](https://github.com/quytelda/mangrove/actions/workflows/unit-tests.yml/badge.svg)](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