-- |
-- Module: Options.Util
-- License: MIT
module Options.Util where

import Data.Char (isAlphaNum, isLetter, isUpper)
import qualified Data.Set as Set

stringToGhc704 :: String -> String
stringToGhc704 :: String -> String
stringToGhc704 = forall a. a -> a
id

validFieldName :: String -> Bool
validFieldName :: String -> Bool
validFieldName = String -> Bool
valid
  where
    valid :: String -> Bool
valid String
s = case String
s of
      [] -> Bool
False
      Char
c : String
cs -> Char -> Bool
validFirst Char
c Bool -> Bool -> Bool
&& forall (t :: * -> *) a. Foldable t => (a -> Bool) -> t a -> Bool
all Char -> Bool
validGeneral String
cs
    validFirst :: Char -> Bool
validFirst Char
c = Char
c forall a. Eq a => a -> a -> Bool
== Char
'_' Bool -> Bool -> Bool
|| (Char -> Bool
isLetter Char
c Bool -> Bool -> Bool
&& Bool -> Bool
not (Char -> Bool
isUpper Char
c))
    validGeneral :: Char -> Bool
validGeneral Char
c = Char -> Bool
isAlphaNum Char
c Bool -> Bool -> Bool
|| Char
c forall a. Eq a => a -> a -> Bool
== Char
'_' Bool -> Bool -> Bool
|| Char
c forall a. Eq a => a -> a -> Bool
== Char
'\''

validShortFlag :: Char -> Bool
validShortFlag :: Char -> Bool
validShortFlag = Char -> Bool
isAlphaNum

validLongFlag :: String -> Bool
validLongFlag :: String -> Bool
validLongFlag = String -> Bool
valid
  where
    valid :: String -> Bool
valid String
s = case String
s of
      [] -> Bool
False
      Char
c : String
cs -> Char -> Bool
validFirst Char
c Bool -> Bool -> Bool
&& forall (t :: * -> *) a. Foldable t => (a -> Bool) -> t a -> Bool
all Char -> Bool
validGeneral String
cs
    validFirst :: Char -> Bool
validFirst = Char -> Bool
isAlphaNum
    validGeneral :: Char -> Bool
validGeneral Char
c = Char -> Bool
isAlphaNum Char
c Bool -> Bool -> Bool
|| Char
c forall a. Eq a => a -> a -> Bool
== Char
'-' Bool -> Bool -> Bool
|| Char
c forall a. Eq a => a -> a -> Bool
== Char
'_'

hasDuplicates :: Ord a => [a] -> Bool
hasDuplicates :: forall a. Ord a => [a] -> Bool
hasDuplicates [a]
xs = forall a. Set a -> Int
Set.size (forall a. Ord a => [a] -> Set a
Set.fromList [a]
xs) forall a. Eq a => a -> a -> Bool
/= forall (t :: * -> *) a. Foldable t => t a -> Int
length [a]
xs

mapEither :: (a -> Either err b) -> [a] -> Either err [b]
mapEither :: forall a err b. (a -> Either err b) -> [a] -> Either err [b]
mapEither a -> Either err b
fn = [b] -> [a] -> Either err [b]
loop []
  where
    loop :: [b] -> [a] -> Either err [b]
loop [b]
acc [] = forall a b. b -> Either a b
Right (forall a. [a] -> [a]
reverse [b]
acc)
    loop [b]
acc (a
a : [a]
as) = case a -> Either err b
fn a
a of
      Left err
err -> forall a b. a -> Either a b
Left err
err
      Right b
b -> [b] -> [a] -> Either err [b]
loop (b
b forall a. a -> [a] -> [a]
: [b]
acc) [a]
as