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

module CLI.Arguments.Sorted.Strict where

import Data.Monoid (mappend)
import Data.Maybe (fromJust)
import Data.List (sortBy)
import CLI.Arguments.Strict
import CLI.Arguments.Parsing.Strict

takeArgsSortedBy
  :: (Arguments -> Bool) -- ^ A predicate to check which 'Arguments' must be kept in the result.
  -> (Arguments -> Arguments -> Ordering) -- ^ A 'compare'-like implementation for 'Arguments'. If needed you can implement your own 'Ord' instance for 'Arguments' and use it here. Here can be partial, just for 'C's.
  -> CLSpecifications
  -> [String]
  -> Args
takeArgsSortedBy :: (Arguments -> Bool)
-> (Arguments -> Arguments -> Ordering)
-> CLSpecifications
-> [String]
-> Args
takeArgsSortedBy Arguments -> Bool
g Arguments -> Arguments -> Ordering
f CLSpecifications
ts [String]
yss = (Arguments -> Arguments -> Ordering) -> Args -> Args
forall a. (a -> a -> Ordering) -> [a] -> [a]
sortBy Arguments -> Arguments -> Ordering
f (Args -> Args)
-> ((Args, [String]) -> Args) -> (Args, [String]) -> Args
forall b c a. (b -> c) -> (a -> b) -> a -> c
. (Args, [String]) -> Args
forall a b. (a, b) -> a
fst ((Args, [String]) -> Args)
-> ((Args, [String]) -> (Args, [String]))
-> (Args, [String])
-> Args
forall b c a. (b -> c) -> (a -> b) -> a -> c
. (Arguments -> Bool)
-> CLSpecifications -> (Args, [String]) -> (Args, [String])
args2ArgsFilteredGR Arguments -> Bool
g CLSpecifications
ts ((Args, [String]) -> Args) -> (Args, [String]) -> Args
forall a b. (a -> b) -> a -> b
$ ([],[String]
yss)
{-# INLINABLE takeArgsSortedBy #-}

takeArgs1SortedBy
  :: 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.
  -> (Arguments -> Arguments -> Ordering) -- ^ A 'compare'-like implementation for 'Arguments'. If needed you can implement your own 'Ord' instance for 'Arguments' and use it here. Here can be partial, just for 'C's.
  -> CLSpecifications
  -> [String]
  -> Args
takeArgs1SortedBy :: FirstChars
-> (Arguments -> Bool)
-> (Arguments -> Arguments -> Ordering)
-> CLSpecifications
-> [String]
-> Args
takeArgs1SortedBy (Char
x1,Char
x2) Arguments -> Bool
g Arguments -> Arguments -> Ordering
f CLSpecifications
ts [String]
yss = (Arguments -> Arguments -> Ordering) -> Args -> Args
forall a. (a -> a -> Ordering) -> [a] -> [a]
sortBy Arguments -> Arguments -> Ordering
f (Args -> Args)
-> ((Args, [String]) -> Args) -> (Args, [String]) -> Args
forall b c a. (b -> c) -> (a -> b) -> a -> c
. (Args, [String]) -> Args
forall a b. (a, b) -> a
fst ((Args, [String]) -> Args)
-> ((Args, [String]) -> (Args, [String]))
-> (Args, [String])
-> Args
forall b c a. (b -> c) -> (a -> b) -> a -> c
. FirstChars
-> (Arguments -> Bool)
-> CLSpecifications
-> (Args, [String])
-> (Args, [String])
args2ArgsFilteredG1R (Char
x1,Char
x2) Arguments -> Bool
g CLSpecifications
ts ((Args, [String]) -> Args) -> (Args, [String]) -> Args
forall a b. (a -> b) -> a -> b
$ ([],[String]
yss)
{-# INLINABLE takeArgs1SortedBy #-}

takeCsSortedBy
  :: (Arguments -> Arguments -> Ordering) -- ^ A 'compare'-like implementation for 'Arguments'. If needed you can implement your own 'Ord' instance for 'Arguments' and use it here. Here can be partial, just for 'C's.
  -> CLSpecifications
  -> [String]
  -> Args
takeCsSortedBy :: (Arguments -> Arguments -> Ordering)
-> CLSpecifications -> [String] -> Args
takeCsSortedBy = (Arguments -> Bool)
-> (Arguments -> Arguments -> Ordering)
-> CLSpecifications
-> [String]
-> Args
takeArgsSortedBy (\Arguments
x -> Arguments -> Bool
notNullArguments Arguments
x Bool -> Bool -> Bool
&& Arguments -> Bool
isC Arguments
x)
{-# INLINABLE takeCsSortedBy #-}

takeCs1SortedBy
  :: 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 -> Arguments -> Ordering) -- ^ A 'compare'-like implementation for 'Arguments'. If needed you can implement your own 'Ord' instance for 'Arguments' and use it here. Here can be partial, just for 'C's.
  -> CLSpecifications
  -> [String]
  -> Args
takeCs1SortedBy :: FirstChars
-> (Arguments -> Arguments -> Ordering)
-> CLSpecifications
-> [String]
-> Args
takeCs1SortedBy (Char
x1,Char
x2) = FirstChars
-> (Arguments -> Bool)
-> (Arguments -> Arguments -> Ordering)
-> CLSpecifications
-> [String]
-> Args
takeArgs1SortedBy (Char
x1,Char
x2) (\Arguments
x -> Arguments -> Bool
notNullArguments Arguments
x Bool -> Bool -> Bool
&& Arguments -> Bool
isC Arguments
x)
{-# INLINABLE takeCs1SortedBy #-}

takeBsSortedBy
  :: (Arguments -> Arguments -> Ordering) -- ^ A 'compare'-like implementation for 'Arguments'. If needed you can implement your own 'Ord' instance for 'Arguments' and use it here. Here can be partial, just for 'B's.
  -> CLSpecifications
  -> [String]
  -> Args
takeBsSortedBy :: (Arguments -> Arguments -> Ordering)
-> CLSpecifications -> [String] -> Args
takeBsSortedBy = (Arguments -> Bool)
-> (Arguments -> Arguments -> Ordering)
-> CLSpecifications
-> [String]
-> Args
takeArgsSortedBy (\Arguments
x -> Arguments -> Bool
notNullArguments Arguments
x Bool -> Bool -> Bool
&& Arguments -> Bool
isB Arguments
x)
{-# INLINABLE takeBsSortedBy #-}

takeAsSortedBy
  :: (Arguments -> Arguments -> Ordering) -- ^ A 'compare'-like implementation for 'Arguments'. If needed you can implement your own 'Ord' instance for 'Arguments' and use it here. Here can be partial, just for 'A's.
  -> CLSpecifications
  -> [String]
  -> Args
takeAsSortedBy :: (Arguments -> Arguments -> Ordering)
-> CLSpecifications -> [String] -> Args
takeAsSortedBy = (Arguments -> Bool)
-> (Arguments -> Arguments -> Ordering)
-> CLSpecifications
-> [String]
-> Args
takeArgsSortedBy (\Arguments
x -> Arguments -> Bool
notNullArguments Arguments
x Bool -> Bool -> Bool
&& Arguments -> Bool
isA Arguments
x)
{-# INLINABLE takeAsSortedBy #-}