{-# OPTIONS_HADDOCK show-extensions #-}
{-# LANGUAGE StrictData, Strict #-}
-- |
-- Module      :  CLI.Arguments.Parsing.Strict
-- Copyright   :  (c) OleksandrZhabenko 2022
-- License     :  MIT
-- Stability   :  Experimental
-- Maintainer  :  olexandr543@yahoo.com
--
-- A library to process command line arguments in some more convenient way.

module CLI.Arguments.Parsing.Strict where

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

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 GQtyArgs -> GQtyArgs -> Bool
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]
q0ssArguments -> Args -> Args
forall a. a -> [a] -> [a]
:Args
ls,[String]
kss [String] -> [String] -> [String]
forall a. Monoid a => a -> a -> a
`mappend` [String]
rss)
  | GQtyArgs
n GQtyArgs -> GQtyArgs -> Bool
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
xsArguments -> Args -> Args
forall a. a -> [a] -> [a]
:Args
ls,[String]
kss [String] -> [String] -> [String]
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 [String] -> GQtyArgs
forall (t :: * -> *) a. Foldable t => t a -> GQtyArgs
length [String]
vss GQtyArgs -> GQtyArgs -> Bool
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]
vssArguments -> Args -> Args
forall a. a -> [a] -> [a]
:Args
ls,[String]
kss [String] -> [String] -> [String]
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) = (String -> Bool) -> [String] -> ([String], [String])
forall a. (a -> Bool) -> [a] -> ([a], [a])
break (String -> String -> Bool
forall a. Eq a => a -> a -> Bool
== String
xs) [String]
xss
            ([String]
w0ss,[String]
wss) = GQtyArgs -> [String] -> ([String], [String])
forall a. GQtyArgs -> [a] -> ([a], [a])
splitAt GQtyArgs
1 [String]
uss
            ([String]
qss,[String]
pss) = (String -> Bool) -> [String] -> ([String], [String])
forall a. (a -> Bool) -> [a] -> ([a], [a])
break (String -> String -> Bool
forall a. Eq a => a -> a -> Bool
== String
xs) [String]
wss
            ([String]
r0ss,[String]
rss) = GQtyArgs -> [String] -> ([String], [String])
forall a. GQtyArgs -> [a] -> ([a], [a])
splitAt GQtyArgs
1 [String]
pss
            ([String]
vss,[String]
zss) = GQtyArgs -> [String] -> ([String], [String])
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 GQtyArgs -> GQtyArgs -> Bool
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]
q0ssArguments -> Args -> Args
forall a. a -> [a] -> [a]
:Args
w3,[String]
kss [String] -> [String] -> [String]
forall a. Monoid a => a -> a -> a
`mappend` [String]
rss)
  | GQtyArgs
n GQtyArgs -> GQtyArgs -> Bool
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
xsArguments -> Args -> Args
forall a. a -> [a] -> [a]
:Args
w1,Args
w2,Args
w3,[String]
kss [String] -> [String] -> [String]
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 [String] -> GQtyArgs
forall (t :: * -> *) a. Foldable t => t a -> GQtyArgs
length [String]
vss GQtyArgs -> GQtyArgs -> Bool
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]
vssArguments -> Args -> Args
forall a. a -> [a] -> [a]
:Args
w2,Args
w3,[String]
kss [String] -> [String] -> [String]
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) = (String -> Bool) -> [String] -> ([String], [String])
forall a. (a -> Bool) -> [a] -> ([a], [a])
break (String -> String -> Bool
forall a. Eq a => a -> a -> Bool
== String
xs) [String]
xss
            ([String]
w0ss,[String]
wss) = GQtyArgs -> [String] -> ([String], [String])
forall a. GQtyArgs -> [a] -> ([a], [a])
splitAt GQtyArgs
1 [String]
uss
            ([String]
qss,[String]
pss) = (String -> Bool) -> [String] -> ([String], [String])
forall a. (a -> Bool) -> [a] -> ([a], [a])
break (String -> String -> Bool
forall a. Eq a => a -> a -> Bool
== String
xs) [String]
wss
            ([String]
r0ss,[String]
rss) = GQtyArgs -> [String] -> ([String], [String])
forall a. GQtyArgs -> [a] -> ([a], [a])
splitAt GQtyArgs
1 [String]
pss
            ([String]
vss,[String]
zss) = GQtyArgs -> [String] -> ([String], [String])
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 GQtyArgs -> GQtyArgs -> Bool
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]
qssArguments -> Args -> Args
forall a. a -> [a] -> [a]
:Args
ls,[String]
kss [String] -> [String] -> [String]
forall a. Monoid a => a -> a -> a
`mappend` [String]
rss)
  | GQtyArgs
n GQtyArgs -> GQtyArgs -> Bool
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
xsArguments -> Args -> Args
forall a. a -> [a] -> [a]
:Args
ls,[String]
kss [String] -> [String] -> [String]
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 [String] -> GQtyArgs
forall (t :: * -> *) a. Foldable t => t a -> GQtyArgs
length [String]
vss GQtyArgs -> GQtyArgs -> Bool
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]
vssArguments -> Args -> Args
forall a. a -> [a] -> [a]
:Args
ls,[String]
kss [String] -> [String] -> [String]
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) = (String -> Bool) -> [String] -> ([String], [String])
forall a. (a -> Bool) -> [a] -> ([a], [a])
break (String -> String -> Bool
forall a. Eq a => a -> a -> Bool
== String
xs) [String]
xss
            ([String]
w0ss,[String]
wss) = GQtyArgs -> [String] -> ([String], [String])
forall a. GQtyArgs -> [a] -> ([a], [a])
splitAt GQtyArgs
1 [String]
uss
            ([String]
qss,[String]
pss) = (String -> Bool) -> [String] -> ([String], [String])
forall a. (a -> Bool) -> [a] -> ([a], [a])
break (\String
rs -> String
rs String -> String -> Bool
forall a. Eq a => a -> a -> Bool
== String
xs Bool -> Bool -> Bool
|| (Char
k Char -> Char -> Bool
forall a. Eq a => a -> a -> Bool
== Char
x1 Bool -> Bool -> Bool
&& String
rs String -> String -> Bool
forall a. Eq a => a -> a -> Bool
== (Char
x2Char -> String -> String
forall a. a -> [a] -> [a]
:String
ks))) [String]
wss
            ([String]
r0ss,[String]
rss) = GQtyArgs -> [String] -> ([String], [String])
forall a. GQtyArgs -> [a] -> ([a], [a])
splitAt GQtyArgs
1 [String]
pss
            ([String]
vss,[String]
zss) = GQtyArgs -> [String] -> ([String], [String])
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 GQtyArgs -> GQtyArgs -> Bool
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]
q0ssArguments -> Args -> Args
forall a. a -> [a] -> [a]
:Args
w3,[String]
kss [String] -> [String] -> [String]
forall a. Monoid a => a -> a -> a
`mappend` [String]
rss)
  | GQtyArgs
n GQtyArgs -> GQtyArgs -> Bool
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
xsArguments -> Args -> Args
forall a. a -> [a] -> [a]
:Args
w1,Args
w2,Args
w3,[String]
kss [String] -> [String] -> [String]
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 [String] -> GQtyArgs
forall (t :: * -> *) a. Foldable t => t a -> GQtyArgs
length [String]
vss GQtyArgs -> GQtyArgs -> Bool
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]
vssArguments -> Args -> Args
forall a. a -> [a] -> [a]
:Args
w2,Args
w3,[String]
kss [String] -> [String] -> [String]
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) = (String -> Bool) -> [String] -> ([String], [String])
forall a. (a -> Bool) -> [a] -> ([a], [a])
break (String -> String -> Bool
forall a. Eq a => a -> a -> Bool
== String
xs) [String]
xss
            ([String]
w0ss,[String]
wss) = GQtyArgs -> [String] -> ([String], [String])
forall a. GQtyArgs -> [a] -> ([a], [a])
splitAt GQtyArgs
1 [String]
uss
            ([String]
qss,[String]
pss) = (String -> Bool) -> [String] -> ([String], [String])
forall a. (a -> Bool) -> [a] -> ([a], [a])
break (\String
rs -> String
rs String -> String -> Bool
forall a. Eq a => a -> a -> Bool
== String
xs Bool -> Bool -> Bool
|| (Char
k Char -> Char -> Bool
forall a. Eq a => a -> a -> Bool
== Char
x1 Bool -> Bool -> Bool
&& String
rs String -> String -> Bool
forall a. Eq a => a -> a -> Bool
== (Char
x2Char -> String -> String
forall a. a -> [a] -> [a]
:String
ks))) [String]
wss
            ([String]
r0ss,[String]
rss) = GQtyArgs -> [String] -> ([String], [String])
forall a. GQtyArgs -> [a] -> ([a], [a])
splitAt GQtyArgs
1 [String]
pss
            ([String]
vss,[String]
zss) = GQtyArgs -> [String] -> ([String], [String])
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 = ((Arguments -> Bool) -> Args -> Args
forall a. (a -> Bool) -> [a] -> [a]
filter Arguments -> Bool
f (Args -> Args) -> (Args -> Args) -> Args -> Args
forall b c a. (b -> c) -> (a -> b) -> a -> c
. (Arguments -> Arguments) -> Args -> Args
forall a b. (a -> b) -> [a] -> [b]
map Arguments -> Arguments
b1Args2AArgs (Args -> Args) -> Args -> Args
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 = ((Arguments -> Bool) -> Args -> Args
forall a. (a -> Bool) -> [a] -> [a]
filter Arguments -> Bool
f (Args -> Args) -> (Args -> Args) -> Args -> Args
forall b c a. (b -> c) -> (a -> b) -> a -> c
. (Arguments -> Arguments) -> Args -> Args
forall a b. (a -> b) -> [a] -> [b]
map Arguments -> Arguments
b1Args2AArgs (Args -> Args) -> Args -> Args
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 #-}