{-# OPTIONS_HADDOCK show-extensions #-}
{-# LANGUAGE NoImplicitPrelude #-}

-- |
-- Module      :  CLI.Arguments.Parsing
-- Copyright   :  (c) OleksandrZhabenko 2022-2023
-- License     :  MIT
-- Stability   :  Experimental
-- Maintainer  :  oleksandr.zhabenko@yahoo.com
--
-- A library to process command line arguments in some more convenient way.

module CLI.Arguments.Parsing where

import GHC.Base
import GHC.List
import Data.Monoid (mappend)
import Data.Maybe (fromJust)
import GHC.Arr
import qualified Data.Foldable as F
import CLI.Arguments

args2ArgsR
  :: CLSpecifications
  -> (Args,[String])
  -> (Args,[String])
args2ArgsR :: CLSpecifications -> (Args, [String]) -> (Args, [String])
args2ArgsR ((t :: Specification
t@(String
xs,GQtyArgs
n)):CLSpecifications
ms) q :: (Args, [String])
q@(Args
ls,xss :: [String]
xss@(String
js:[String]
jss))
  | GQtyArgs
n forall a. Ord a => a -> a -> Bool
< GQtyArgs
0 = case [String]
w0ss of
             [] -> CLSpecifications -> (Args, [String]) -> (Args, [String])
args2ArgsR CLSpecifications
ms (Args, [String])
q
             [String]
w00ss -> case [String]
qss of
                       [] -> CLSpecifications -> (Args, [String]) -> (Args, [String])
args2ArgsR CLSpecifications
ms (Args, [String])
q
                       [String]
q0ss -> CLSpecifications -> (Args, [String]) -> (Args, [String])
args2ArgsR CLSpecifications
ms (String -> [String] -> Arguments
C String
xs [String]
q0ssforall a. a -> [a] -> [a]
:Args
ls,[String]
kss forall a. Monoid a => a -> a -> a
`mappend` [String]
rss)
  | GQtyArgs
n forall a. Eq a => a -> a -> Bool
== GQtyArgs
0 = case [String]
w0ss of
              [] -> CLSpecifications -> (Args, [String]) -> (Args, [String])
args2ArgsR CLSpecifications
ms (Args, [String])
q
              [String]
w00ss -> CLSpecifications -> (Args, [String]) -> (Args, [String])
args2ArgsR CLSpecifications
ms (String -> Arguments
A String
xsforall a. a -> [a] -> [a]
:Args
ls,[String]
kss forall a. Monoid a => a -> a -> a
`mappend` [String]
wss)
  | Bool
otherwise = case [String]
w0ss of
                 [] -> CLSpecifications -> (Args, [String]) -> (Args, [String])
args2ArgsR CLSpecifications
ms (Args, [String])
q
                 [String]
w00ss -> if forall a. [a] -> GQtyArgs
length [String]
vss forall a. Eq a => a -> a -> Bool
== GQtyArgs
n then CLSpecifications -> (Args, [String]) -> (Args, [String])
args2ArgsR CLSpecifications
ms (GQtyArgs -> String -> [String] -> Arguments
B GQtyArgs
n String
xs [String]
vssforall a. a -> [a] -> [a]
:Args
ls,[String]
kss forall a. Monoid a => a -> a -> a
`mappend` [String]
zss)
                          else CLSpecifications -> (Args, [String]) -> (Args, [String])
args2ArgsR CLSpecifications
ms (Args, [String])
q
      where ([String]
kss,[String]
uss) = forall a. (a -> Bool) -> [a] -> ([a], [a])
break (forall a. Eq a => a -> a -> Bool
== String
xs) [String]
xss
            ([String]
w0ss,[String]
wss) = forall a. GQtyArgs -> [a] -> ([a], [a])
splitAt GQtyArgs
1 [String]
uss
            ([String]
qss,[String]
pss) = forall a. (a -> Bool) -> [a] -> ([a], [a])
break (forall a. Eq a => a -> a -> Bool
== String
xs) [String]
wss
            ([String]
r0ss,[String]
rss) = forall a. GQtyArgs -> [a] -> ([a], [a])
splitAt GQtyArgs
1 [String]
pss
            ([String]
vss,[String]
zss) = forall a. GQtyArgs -> [a] -> ([a], [a])
splitAt GQtyArgs
n [String]
wss
args2ArgsR CLSpecifications
_ (Args, [String])
q = (Args, [String])
q

args2ArgsR0
  :: CLSpecifications
  -> [String]
  -> (Args,[String])
args2ArgsR0 :: CLSpecifications -> [String] -> (Args, [String])
args2ArgsR0 CLSpecifications
xs [String]
yss = CLSpecifications -> (Args, [String]) -> (Args, [String])
args2ArgsR CLSpecifications
xs ([],[String]
yss)
{-# INLINABLE args2ArgsR0 #-}

args2Args3'R
  :: CLSpecifications
  -> (Args,Args,Args,[String])
  -> (Args,Args,Args,[String])
args2Args3'R :: CLSpecifications
-> (Args, Args, Args, [String]) -> (Args, Args, Args, [String])
args2Args3'R (t :: Specification
t@(String
xs,GQtyArgs
n):CLSpecifications
ts) q :: (Args, Args, Args, [String])
q@(Args
w1,Args
w2,Args
w3,xss :: [String]
xss@(String
js:[String]
jss))
  | GQtyArgs
n forall a. Ord a => a -> a -> Bool
< GQtyArgs
0 = case [String]
w0ss of
             [] -> CLSpecifications
-> (Args, Args, Args, [String]) -> (Args, Args, Args, [String])
args2Args3'R CLSpecifications
ts (Args, Args, Args, [String])
q
             [String]
w00ss -> case [String]
qss of
                       [] -> CLSpecifications
-> (Args, Args, Args, [String]) -> (Args, Args, Args, [String])
args2Args3'R CLSpecifications
ts (Args, Args, Args, [String])
q
                       [String]
q0ss -> CLSpecifications
-> (Args, Args, Args, [String]) -> (Args, Args, Args, [String])
args2Args3'R CLSpecifications
ts (Args
w1,Args
w2,String -> [String] -> Arguments
C String
xs [String]
q0ssforall a. a -> [a] -> [a]
:Args
w3,[String]
kss forall a. Monoid a => a -> a -> a
`mappend` [String]
rss)
  | GQtyArgs
n forall a. Eq a => a -> a -> Bool
== GQtyArgs
0 = case [String]
w0ss of
              [] -> CLSpecifications
-> (Args, Args, Args, [String]) -> (Args, Args, Args, [String])
args2Args3'R CLSpecifications
ts (Args, Args, Args, [String])
q
              [String]
w00ss -> CLSpecifications
-> (Args, Args, Args, [String]) -> (Args, Args, Args, [String])
args2Args3'R CLSpecifications
ts (String -> Arguments
A String
xsforall a. a -> [a] -> [a]
:Args
w1,Args
w2,Args
w3,[String]
kss forall a. Monoid a => a -> a -> a
`mappend` [String]
wss)
  | Bool
otherwise = case [String]
w0ss of
                 [] -> CLSpecifications
-> (Args, Args, Args, [String]) -> (Args, Args, Args, [String])
args2Args3'R CLSpecifications
ts (Args, Args, Args, [String])
q
                 [String]
w00ss -> if forall a. [a] -> GQtyArgs
length [String]
vss forall a. Eq a => a -> a -> Bool
== GQtyArgs
n then CLSpecifications
-> (Args, Args, Args, [String]) -> (Args, Args, Args, [String])
args2Args3'R CLSpecifications
ts (Args
w1,GQtyArgs -> String -> [String] -> Arguments
B GQtyArgs
n String
xs [String]
vssforall a. a -> [a] -> [a]
:Args
w2,Args
w3,[String]
kss forall a. Monoid a => a -> a -> a
`mappend` [String]
zss)
                          else CLSpecifications
-> (Args, Args, Args, [String]) -> (Args, Args, Args, [String])
args2Args3'R CLSpecifications
ts (Args, Args, Args, [String])
q
      where ([String]
kss,[String]
uss) = forall a. (a -> Bool) -> [a] -> ([a], [a])
break (forall a. Eq a => a -> a -> Bool
== String
xs) [String]
xss
            ([String]
w0ss,[String]
wss) = forall a. GQtyArgs -> [a] -> ([a], [a])
splitAt GQtyArgs
1 [String]
uss
            ([String]
qss,[String]
pss) = forall a. (a -> Bool) -> [a] -> ([a], [a])
break (forall a. Eq a => a -> a -> Bool
== String
xs) [String]
wss
            ([String]
r0ss,[String]
rss) = forall a. GQtyArgs -> [a] -> ([a], [a])
splitAt GQtyArgs
1 [String]
pss
            ([String]
vss,[String]
zss) = forall a. GQtyArgs -> [a] -> ([a], [a])
splitAt GQtyArgs
n [String]
wss
args2Args3'R CLSpecifications
_ (Args, Args, Args, [String])
q = (Args, Args, Args, [String])
q

args2Args3R
  :: CLSpecifications
  -> [String]
  -> (Args,Args,Args,[String])
args2Args3R :: CLSpecifications -> [String] -> (Args, Args, Args, [String])
args2Args3R CLSpecifications
xs [String]
yss = CLSpecifications
-> (Args, Args, Args, [String]) -> (Args, Args, Args, [String])
args2Args3'R CLSpecifications
xs ([],[],[],[String]
yss)
{-# INLINABLE args2Args3R #-}

------------------------------------------------------------------------------

args2Args1R
  :: FirstChars -- ^ A pair of the first characters of the starting group delimiter (the same for all 'String's in the all 'CLSpecifications') and the probable its modification (the first character of the last delimiter).
  -> CLSpecifications
  -> (Args,[String])
  ->  (Args,[String])
args2Args1R :: FirstChars
-> CLSpecifications -> (Args, [String]) -> (Args, [String])
args2Args1R (Char
x1,Char
x2) (t :: Specification
t@(xs :: String
xs@(Char
k:String
ks),GQtyArgs
n):CLSpecifications
ts) q :: (Args, [String])
q@(Args
ls,xss :: [String]
xss@(String
js:[String]
jss))
  | GQtyArgs
n forall a. Ord a => a -> a -> Bool
< GQtyArgs
0 = case [String]
w0ss of
             [] -> FirstChars
-> CLSpecifications -> (Args, [String]) -> (Args, [String])
args2Args1R (Char
x1,Char
x2) CLSpecifications
ts (Args, [String])
q
             [String]
w00ss -> case [String]
qss of
                       [] -> FirstChars
-> CLSpecifications -> (Args, [String]) -> (Args, [String])
args2Args1R (Char
x1,Char
x2) CLSpecifications
ts (Args, [String])
q
                       [String]
q0ss -> FirstChars
-> CLSpecifications -> (Args, [String]) -> (Args, [String])
args2Args1R (Char
x1,Char
x2) CLSpecifications
ts (String -> [String] -> Arguments
C String
xs [String]
qssforall a. a -> [a] -> [a]
:Args
ls,[String]
kss forall a. Monoid a => a -> a -> a
`mappend` [String]
rss)
  | GQtyArgs
n forall a. Eq a => a -> a -> Bool
== GQtyArgs
0 = case [String]
w0ss of
              [] -> FirstChars
-> CLSpecifications -> (Args, [String]) -> (Args, [String])
args2Args1R (Char
x1,Char
x2) CLSpecifications
ts (Args, [String])
q
              [String]
w00ss -> FirstChars
-> CLSpecifications -> (Args, [String]) -> (Args, [String])
args2Args1R (Char
x1,Char
x2) CLSpecifications
ts (String -> Arguments
A String
xsforall a. a -> [a] -> [a]
:Args
ls,[String]
kss forall a. Monoid a => a -> a -> a
`mappend` [String]
wss)
  | Bool
otherwise = case [String]
w0ss of
                 [] -> FirstChars
-> CLSpecifications -> (Args, [String]) -> (Args, [String])
args2Args1R (Char
x1,Char
x2) CLSpecifications
ts (Args, [String])
q
                 [String]
w00ss -> if forall a. [a] -> GQtyArgs
length [String]
vss forall a. Eq a => a -> a -> Bool
== GQtyArgs
n then FirstChars
-> CLSpecifications -> (Args, [String]) -> (Args, [String])
args2Args1R (Char
x1,Char
x2) CLSpecifications
ts (GQtyArgs -> String -> [String] -> Arguments
B GQtyArgs
n String
xs [String]
vssforall a. a -> [a] -> [a]
:Args
ls,[String]
kss forall a. Monoid a => a -> a -> a
`mappend` [String]
zss)
                          else FirstChars
-> CLSpecifications -> (Args, [String]) -> (Args, [String])
args2Args1R (Char
x1,Char
x2) CLSpecifications
ts (Args, [String])
q
      where ([String]
kss,[String]
uss) = forall a. (a -> Bool) -> [a] -> ([a], [a])
break (forall a. Eq a => a -> a -> Bool
== String
xs) [String]
xss
            ([String]
w0ss,[String]
wss) = forall a. GQtyArgs -> [a] -> ([a], [a])
splitAt GQtyArgs
1 [String]
uss
            ([String]
qss,[String]
pss) = forall a. (a -> Bool) -> [a] -> ([a], [a])
break (\String
rs -> String
rs forall a. Eq a => a -> a -> Bool
== String
xs Bool -> Bool -> Bool
|| (Char
k forall a. Eq a => a -> a -> Bool
== Char
x1 Bool -> Bool -> Bool
&& String
rs forall a. Eq a => a -> a -> Bool
== (Char
x2forall a. a -> [a] -> [a]
:String
ks))) [String]
wss
            ([String]
r0ss,[String]
rss) = forall a. GQtyArgs -> [a] -> ([a], [a])
splitAt GQtyArgs
1 [String]
pss
            ([String]
vss,[String]
zss) = forall a. GQtyArgs -> [a] -> ([a], [a])
splitAt GQtyArgs
n [String]
wss
args2Args1R (Char
x1,Char
x2) (t :: Specification
t@([],GQtyArgs
n):CLSpecifications
ts) (Args, [String])
q = FirstChars
-> CLSpecifications -> (Args, [String]) -> (Args, [String])
args2Args1R (Char
x1,Char
x2) CLSpecifications
ts (Args, [String])
q
args2Args1R FirstChars
_ CLSpecifications
_ (Args, [String])
q = (Args, [String])
q

args2Args3'1R
  :: FirstChars -- ^ A pair of the first characters of the starting group delimiter (the same for all 'String's in the all 'CLSpecifications') and the probable its modification (the first character of the last delimiter).
  -> CLSpecifications
  -> (Args,Args,Args,[String])
  -> (Args,Args,Args,[String])
args2Args3'1R :: FirstChars
-> CLSpecifications
-> (Args, Args, Args, [String])
-> (Args, Args, Args, [String])
args2Args3'1R (Char
x1,Char
x2) (t :: Specification
t@(xs :: String
xs@(Char
k:String
ks),GQtyArgs
n):CLSpecifications
ts) q :: (Args, Args, Args, [String])
q@(Args
w1,Args
w2,Args
w3,xss :: [String]
xss@(String
js:[String]
jss))
  | GQtyArgs
n forall a. Ord a => a -> a -> Bool
< GQtyArgs
0 = case [String]
w0ss of
             [] -> FirstChars
-> CLSpecifications
-> (Args, Args, Args, [String])
-> (Args, Args, Args, [String])
args2Args3'1R (Char
x1,Char
x2) CLSpecifications
ts (Args, Args, Args, [String])
q
             [String]
w00ss -> case [String]
qss of
                       [] -> FirstChars
-> CLSpecifications
-> (Args, Args, Args, [String])
-> (Args, Args, Args, [String])
args2Args3'1R (Char
x1,Char
x2) CLSpecifications
ts (Args, Args, Args, [String])
q
                       [String]
q0ss -> FirstChars
-> CLSpecifications
-> (Args, Args, Args, [String])
-> (Args, Args, Args, [String])
args2Args3'1R (Char
x1,Char
x2) CLSpecifications
ts (Args
w1,Args
w2,String -> [String] -> Arguments
C String
xs [String]
q0ssforall a. a -> [a] -> [a]
:Args
w3,[String]
kss forall a. Monoid a => a -> a -> a
`mappend` [String]
rss)
  | GQtyArgs
n forall a. Eq a => a -> a -> Bool
== GQtyArgs
0 = case [String]
w0ss of
              [] -> FirstChars
-> CLSpecifications
-> (Args, Args, Args, [String])
-> (Args, Args, Args, [String])
args2Args3'1R (Char
x1,Char
x2) CLSpecifications
ts (Args, Args, Args, [String])
q
              [String]
w00ss -> FirstChars
-> CLSpecifications
-> (Args, Args, Args, [String])
-> (Args, Args, Args, [String])
args2Args3'1R (Char
x1,Char
x2) CLSpecifications
ts (String -> Arguments
A String
xsforall a. a -> [a] -> [a]
:Args
w1,Args
w2,Args
w3,[String]
kss forall a. Monoid a => a -> a -> a
`mappend` [String]
wss)
  | Bool
otherwise = case [String]
w0ss of
                 [] -> FirstChars
-> CLSpecifications
-> (Args, Args, Args, [String])
-> (Args, Args, Args, [String])
args2Args3'1R (Char
x1,Char
x2) CLSpecifications
ts (Args, Args, Args, [String])
q
                 [String]
w00ss -> if forall a. [a] -> GQtyArgs
length [String]
vss forall a. Eq a => a -> a -> Bool
== GQtyArgs
n then FirstChars
-> CLSpecifications
-> (Args, Args, Args, [String])
-> (Args, Args, Args, [String])
args2Args3'1R (Char
x1,Char
x2) CLSpecifications
ts (Args
w1,GQtyArgs -> String -> [String] -> Arguments
B GQtyArgs
n String
xs [String]
vssforall a. a -> [a] -> [a]
:Args
w2,Args
w3,[String]
kss forall a. Monoid a => a -> a -> a
`mappend` [String]
zss)
                          else FirstChars
-> CLSpecifications
-> (Args, Args, Args, [String])
-> (Args, Args, Args, [String])
args2Args3'1R (Char
x1,Char
x2) CLSpecifications
ts (Args, Args, Args, [String])
q
      where ([String]
kss,[String]
uss) = forall a. (a -> Bool) -> [a] -> ([a], [a])
break (forall a. Eq a => a -> a -> Bool
== String
xs) [String]
xss
            ([String]
w0ss,[String]
wss) = forall a. GQtyArgs -> [a] -> ([a], [a])
splitAt GQtyArgs
1 [String]
uss
            ([String]
qss,[String]
pss) = forall a. (a -> Bool) -> [a] -> ([a], [a])
break (\String
rs -> String
rs forall a. Eq a => a -> a -> Bool
== String
xs Bool -> Bool -> Bool
|| (Char
k forall a. Eq a => a -> a -> Bool
== Char
x1 Bool -> Bool -> Bool
&& String
rs forall a. Eq a => a -> a -> Bool
== (Char
x2forall a. a -> [a] -> [a]
:String
ks))) [String]
wss
            ([String]
r0ss,[String]
rss) = forall a. GQtyArgs -> [a] -> ([a], [a])
splitAt GQtyArgs
1 [String]
pss
            ([String]
vss,[String]
zss) = forall a. GQtyArgs -> [a] -> ([a], [a])
splitAt GQtyArgs
n [String]
wss
args2Args3'1R (Char
x1,Char
x2) CLSpecifications
_ (Args, Args, Args, [String])
q = (Args, Args, Args, [String])
q

args2Args31R
  :: FirstChars -- ^ A pair of the first characters of the starting group delimiter (the same for all 'String's in the all 'CLSpecifications') and the probable its modification (the first character of the last delimiter).
  -> CLSpecifications
  -> [String]
  -> (Args,Args,Args,[String])
args2Args31R :: FirstChars
-> CLSpecifications -> [String] -> (Args, Args, Args, [String])
args2Args31R (Char
x1,Char
x2) CLSpecifications
xs [String]
yss = FirstChars
-> CLSpecifications
-> (Args, Args, Args, [String])
-> (Args, Args, Args, [String])
args2Args3'1R (Char
x1,Char
x2) CLSpecifications
xs ([],[],[],[String]
yss)
{-# INLINABLE args2Args31R #-}

----------------------------------------------------------------------

-- | This function can actually parse the command line arguments being the ['String'].
args2ArgsFilteredGR
  :: (Arguments -> Bool) -- ^ A predicate to check which 'Arguments' must be kept in the result.
  -> CLSpecifications
  -> (Args,[String])
  -> (Args,[String])
args2ArgsFilteredGR :: (Arguments -> Bool)
-> CLSpecifications -> (Args, [String]) -> (Args, [String])
args2ArgsFilteredGR Arguments -> Bool
f CLSpecifications
ts (Args, [String])
r = (forall a. (a -> Bool) -> [a] -> [a]
filter Arguments -> Bool
f forall b c a. (b -> c) -> (a -> b) -> a -> c
. forall a b. (a -> b) -> [a] -> [b]
map Arguments -> Arguments
b1Args2AArgs forall a b. (a -> b) -> a -> b
$ Args
qs, [String]
yss)
  where (Args
qs,[String]
yss) = CLSpecifications -> (Args, [String]) -> (Args, [String])
args2ArgsR CLSpecifications
ts (Args, [String])
r
{-# INLINABLE args2ArgsFilteredGR #-}

-- | This function can actually parse the command line arguments being the ['String'].
args2ArgsFilteredG1R
  :: FirstChars -- ^ A pair of the first characters of the starting group delimiter (the same for all 'String's in the all 'CLSpecifications') and the probable its modification (the first character of the last delimiter).
  -> (Arguments -> Bool) -- ^ A predicate to check which 'Arguments' must be kept in the result.
  -> CLSpecifications
  -> (Args,[String])
  -> (Args,[String])
args2ArgsFilteredG1R :: FirstChars
-> (Arguments -> Bool)
-> CLSpecifications
-> (Args, [String])
-> (Args, [String])
args2ArgsFilteredG1R (Char
x1,Char
x2) Arguments -> Bool
f CLSpecifications
ts (Args, [String])
r = (forall a. (a -> Bool) -> [a] -> [a]
filter Arguments -> Bool
f forall b c a. (b -> c) -> (a -> b) -> a -> c
. forall a b. (a -> b) -> [a] -> [b]
map Arguments -> Arguments
b1Args2AArgs forall a b. (a -> b) -> a -> b
$ Args
qs, [String]
yss)
  where (Args
qs,[String]
yss) = FirstChars
-> CLSpecifications -> (Args, [String]) -> (Args, [String])
args2Args1R (Char
x1,Char
x2) CLSpecifications
ts (Args, [String])
r
{-# INLINABLE args2ArgsFilteredG1R #-}

----------------------------------------------------------------------

takeCsR
  :: CLSpecifications
  -> [String]
  -> (Args,[String])
takeCsR :: CLSpecifications -> [String] -> (Args, [String])
takeCsR CLSpecifications
xs [String]
yss = (Arguments -> Bool)
-> CLSpecifications -> (Args, [String]) -> (Args, [String])
args2ArgsFilteredGR (\Arguments
x -> Arguments -> Bool
notNullArguments Arguments
x Bool -> Bool -> Bool
&& Arguments -> Bool
isC Arguments
x) CLSpecifications
xs ([],[String]
yss)
{-# INLINABLE takeCsR #-}

takeCs1R
  :: FirstChars -- ^ A pair of the first characters of the starting group delimiter (the same for all 'String's in the all 'CLSpecifications') and the probable its modification (the first character of the last delimiter).
  -> CLSpecifications
  -> [String]
  -> (Args,[String])
takeCs1R :: FirstChars -> CLSpecifications -> [String] -> (Args, [String])
takeCs1R (Char
x1,Char
x2) CLSpecifications
xs [String]
yss = FirstChars
-> (Arguments -> Bool)
-> CLSpecifications
-> (Args, [String])
-> (Args, [String])
args2ArgsFilteredG1R (Char
x1,Char
x2) (\Arguments
x -> Arguments -> Bool
notNullArguments Arguments
x Bool -> Bool -> Bool
&& Arguments -> Bool
isC Arguments
x) CLSpecifications
xs ([],[String]
yss)
{-# INLINABLE takeCs1R #-}

takeBsR
  :: CLSpecifications
  -> [String]
  -> (Args,[String])
takeBsR :: CLSpecifications -> [String] -> (Args, [String])
takeBsR CLSpecifications
xs [String]
yss = (Arguments -> Bool)
-> CLSpecifications -> (Args, [String]) -> (Args, [String])
args2ArgsFilteredGR (\Arguments
x -> Arguments -> Bool
notNullArguments Arguments
x Bool -> Bool -> Bool
&& Arguments -> Bool
isB Arguments
x) CLSpecifications
xs ([],[String]
yss)
{-# INLINABLE takeBsR #-}

takeAsR
  :: CLSpecifications
  -> [String]
  -> (Args,[String])
takeAsR :: CLSpecifications -> [String] -> (Args, [String])
takeAsR CLSpecifications
xs [String]
yss = (Arguments -> Bool)
-> CLSpecifications -> (Args, [String]) -> (Args, [String])
args2ArgsFilteredGR (\Arguments
x -> Arguments -> Bool
notNullArguments Arguments
x Bool -> Bool -> Bool
&& Arguments -> Bool
isA Arguments
x) CLSpecifications
xs ([],[String]
yss)
{-# INLINABLE takeAsR #-}