From 6f5d26ff39305cbac76cf05616902e7ad4a7714e Mon Sep 17 00:00:00 2001 From: Zoe Roux Date: Thu, 11 Mar 2021 16:41:23 +0100 Subject: [PATCH] Supporting positional arguments --- GetOpt.hs | 14 +++++++++----- 1 file changed, 9 insertions(+), 5 deletions(-) diff --git a/GetOpt.hs b/GetOpt.hs index 5c381eb..ce1a260 100644 --- a/GetOpt.hs +++ b/GetOpt.hs @@ -19,22 +19,26 @@ import GetOpt.Parsers getOpt :: Parser a -> [String] -> Maybe (a, [String]) getOpt (DefParser a) args = Just (a, args) getOpt p args = case runParser p args of - Just (p1, args1) -> getOpt p1 args1 - Nothing -> Nothing + Just (p1@(OptParser _ _), args1) -> getOpt p1 args1 + Just (DefParser a, args1) -> Just (a, args1) + Nothing -> Nothing runParser :: Parser a -> [String] -> Maybe (Parser a, [String]) -runParser p@(DefParser _) args = Nothing +runParser p@(DefParser _) args = Just (p, args) runParser (OptParser opt next) [] = do def <- defaultValue opt return (fmap def next, []) -runParser (OptParser opt next) (identifier:args) +runParser p@(OptParser opt next) (identifier:args) | optionMatch opt identifier = do (ret, lo) <- getArg opt args return (fmap ret next, lo) + | (DefParser _) <- next = do + (ret, lo) <- runParser p args + return (ret, identifier:lo) | otherwise = do (nextP, newArgs) <- runParser next (identifier:args) return (OptParser opt nextP, newArgs) - + where getArg :: Option a -> [String] -> Maybe (a, [String]) getArg opt (arg:args)