module Options.Applicative.CmdLine.Util
(
AttoParser
, attoReadM
, optionA
, splitWith
, splitOn
, anyOf
, anyOfSkip
, anyOfRM
, aliases
, showSepChars
) where
import qualified Data.Attoparsec.Text as A
import qualified Data.Text as T
import Data.Text (Text)
import Options.Applicative (Mod, OptionFields, Parser, ReadM, eitherReader, option)
type AttoParser = A.Parser
attoReadM :: AttoParser a -> ReadM a
attoReadM :: forall a. AttoParser a -> ReadM a
attoReadM AttoParser a
p = (String -> Either String a) -> ReadM a
forall a. (String -> Either String a) -> ReadM a
eitherReader (AttoParser a -> Text -> Either String a
forall a. Parser a -> Text -> Either String a
A.parseOnly AttoParser a
p (Text -> Either String a)
-> (String -> Text) -> String -> Either String a
forall b c a. (b -> c) -> (a -> b) -> a -> c
. String -> Text
T.pack)
optionA :: AttoParser a -> Mod OptionFields a -> Parser a
optionA :: forall a. AttoParser a -> Mod OptionFields a -> Parser a
optionA = ReadM a -> Mod OptionFields a -> Parser a
forall a. ReadM a -> Mod OptionFields a -> Parser a
option (ReadM a -> Mod OptionFields a -> Parser a)
-> (AttoParser a -> ReadM a)
-> AttoParser a
-> Mod OptionFields a
-> Parser a
forall b c a. (b -> c) -> (a -> b) -> a -> c
. AttoParser a -> ReadM a
forall a. AttoParser a -> ReadM a
attoReadM
splitWith
:: AttoParser p
-> String
-> AttoParser [p]
splitWith :: forall p. AttoParser p -> String -> AttoParser [p]
splitWith AttoParser p
p String
sepChars = [Parser Text [p]] -> Parser Text [p]
forall (f :: * -> *) a. Alternative f => [f a] -> f a
A.choice
[ [] [p] -> Parser Text () -> Parser Text [p]
forall a b. a -> Parser Text b -> Parser Text a
forall (f :: * -> *) a b. Functor f => a -> f b -> f a
<$ Parser Text ()
forall t. Chunk t => Parser t ()
A.endOfInput
, AttoParser p
p AttoParser p -> Parser Text Char -> Parser Text [p]
forall (f :: * -> *) a s. Alternative f => f a -> f s -> f [a]
`A.sepBy` (Parser Text ()
A.skipSpace Parser Text () -> Parser Text Char -> Parser Text Char
forall a b. Parser Text a -> Parser Text b -> Parser Text b
forall (f :: * -> *) a b. Applicative f => f a -> f b -> f b
*> (Char -> Parser Text Char) -> String -> Parser Text Char
forall m a. Monoid m => (a -> m) -> [a] -> m
forall (t :: * -> *) m a.
(Foldable t, Monoid m) =>
(a -> m) -> t a -> m
foldMap Char -> Parser Text Char
A.char String
sepChars Parser Text Char -> Parser Text () -> Parser Text Char
forall a b. Parser Text a -> Parser Text b -> Parser Text a
forall (f :: * -> *) a b. Applicative f => f a -> f b -> f a
<* Parser Text ()
A.skipSpace)
]
splitOn :: String -> AttoParser [Text]
splitOn :: String -> AttoParser [Text]
splitOn String
sepChars = (Char -> Bool) -> Parser Text
A.takeWhile (Char -> String -> Bool
forall (t :: * -> *) a. (Foldable t, Eq a) => a -> t a -> Bool
`notElem` String
sepChars) Parser Text -> String -> AttoParser [Text]
forall p. AttoParser p -> String -> AttoParser [p]
`splitWith` String
sepChars
aliases :: Foldable t => t Text -> AttoParser Text
aliases :: forall (t :: * -> *). Foldable t => t Text -> Parser Text
aliases = (Text -> Parser Text) -> t Text -> Parser Text
forall m a. Monoid m => (a -> m) -> t a -> m
forall (t :: * -> *) m a.
(Foldable t, Monoid m) =>
(a -> m) -> t a -> m
foldMap Text -> Parser Text
A.asciiCI
{-# INLINE aliases #-}
anyOf :: [(a, [Text])] -> AttoParser a
anyOf :: forall a. [(a, [Text])] -> AttoParser a
anyOf = [Parser Text a] -> Parser Text a
forall (f :: * -> *) a. Alternative f => [f a] -> f a
A.choice ([Parser Text a] -> Parser Text a)
-> ([(a, [Text])] -> [Parser Text a])
-> [(a, [Text])]
-> Parser Text a
forall b c a. (b -> c) -> (a -> b) -> a -> c
. ((a, [Text]) -> Parser Text a) -> [(a, [Text])] -> [Parser Text a]
forall a b. (a -> b) -> [a] -> [b]
map (\(a
a, [Text]
ts) -> a
a a -> Parser Text -> Parser Text a
forall a b. a -> Parser Text b -> Parser Text a
forall (f :: * -> *) a b. Functor f => a -> f b -> f a
<$ [Text] -> Parser Text
forall (t :: * -> *). Foldable t => t Text -> Parser Text
aliases [Text]
ts)
anyOfSkip :: (Char -> Bool) -> [(a, [Text])] -> AttoParser a
anyOfSkip :: forall a. (Char -> Bool) -> [(a, [Text])] -> AttoParser a
anyOfSkip Char -> Bool
p [(a, [Text])]
xs = [(a, [Text])] -> AttoParser a
forall a. [(a, [Text])] -> AttoParser a
anyOf [(a, [Text])]
xs AttoParser a -> Parser Text () -> AttoParser a
forall a b. Parser Text a -> Parser Text b -> Parser Text a
forall (f :: * -> *) a b. Applicative f => f a -> f b -> f a
<* (Char -> Bool) -> Parser Text ()
A.skipWhile Char -> Bool
p
anyOfRM :: [(a, [Text])] -> ReadM a
anyOfRM :: forall a. [(a, [Text])] -> ReadM a
anyOfRM = AttoParser a -> ReadM a
forall a. AttoParser a -> ReadM a
attoReadM (AttoParser a -> ReadM a)
-> ([(a, [Text])] -> AttoParser a) -> [(a, [Text])] -> ReadM a
forall b c a. (b -> c) -> (a -> b) -> a -> c
. [(a, [Text])] -> AttoParser a
forall a. [(a, [Text])] -> AttoParser a
anyOf
showSepChars :: Foldable t => t Char -> String
showSepChars :: forall (t :: * -> *). Foldable t => t Char -> String
showSepChars = (Char -> String) -> t Char -> String
forall (t :: * -> *) a b. Foldable t => (a -> [b]) -> t a -> [b]
concatMap ((Char
' ' Char -> String -> String
forall a. a -> [a] -> [a]
:) (String -> String) -> (Char -> String) -> Char -> String
forall b c a. (b -> c) -> (a -> b) -> a -> c
. (Char -> String -> String
forall a. a -> [a] -> [a]
:[]))
{-# INLINE showSepChars #-}