module Foreign.Hoppy.Generator.Version (
Filtered,
collect,
none,
just,
test,
CppVersion (..),
defaultCppVersion,
activeCppVersion,
) where
import Data.Maybe (catMaybes)
import System.Environment (lookupEnv)
import System.IO (hPutStrLn, stderr)
import System.IO.Unsafe (unsafePerformIO)
type Filtered = Maybe
collect :: [Filtered a] -> [a]
collect :: [Filtered a] -> [a]
collect = [Filtered a] -> [a]
forall a. [Maybe a] -> [a]
catMaybes
none :: Filtered a
none :: Filtered a
none = Filtered a
forall a. Maybe a
Nothing
just :: a -> Filtered a
just :: a -> Filtered a
just = a -> Filtered a
forall a. a -> Maybe a
Just
test :: Bool -> a -> Filtered a
test :: Bool -> a -> Filtered a
test Bool
True = a -> Filtered a
forall a. a -> Maybe a
Just
test Bool
False = Filtered a -> a -> Filtered a
forall a b. a -> b -> a
const Filtered a
forall a. Maybe a
Nothing
data CppVersion =
Cpp1998
| Cpp2011
| Cpp2014
deriving (CppVersion
CppVersion -> CppVersion -> Bounded CppVersion
forall a. a -> a -> Bounded a
maxBound :: CppVersion
$cmaxBound :: CppVersion
minBound :: CppVersion
$cminBound :: CppVersion
Bounded, Int -> CppVersion
CppVersion -> Int
CppVersion -> [CppVersion]
CppVersion -> CppVersion
CppVersion -> CppVersion -> [CppVersion]
CppVersion -> CppVersion -> CppVersion -> [CppVersion]
(CppVersion -> CppVersion)
-> (CppVersion -> CppVersion)
-> (Int -> CppVersion)
-> (CppVersion -> Int)
-> (CppVersion -> [CppVersion])
-> (CppVersion -> CppVersion -> [CppVersion])
-> (CppVersion -> CppVersion -> [CppVersion])
-> (CppVersion -> CppVersion -> CppVersion -> [CppVersion])
-> Enum CppVersion
forall a.
(a -> a)
-> (a -> a)
-> (Int -> a)
-> (a -> Int)
-> (a -> [a])
-> (a -> a -> [a])
-> (a -> a -> [a])
-> (a -> a -> a -> [a])
-> Enum a
enumFromThenTo :: CppVersion -> CppVersion -> CppVersion -> [CppVersion]
$cenumFromThenTo :: CppVersion -> CppVersion -> CppVersion -> [CppVersion]
enumFromTo :: CppVersion -> CppVersion -> [CppVersion]
$cenumFromTo :: CppVersion -> CppVersion -> [CppVersion]
enumFromThen :: CppVersion -> CppVersion -> [CppVersion]
$cenumFromThen :: CppVersion -> CppVersion -> [CppVersion]
enumFrom :: CppVersion -> [CppVersion]
$cenumFrom :: CppVersion -> [CppVersion]
fromEnum :: CppVersion -> Int
$cfromEnum :: CppVersion -> Int
toEnum :: Int -> CppVersion
$ctoEnum :: Int -> CppVersion
pred :: CppVersion -> CppVersion
$cpred :: CppVersion -> CppVersion
succ :: CppVersion -> CppVersion
$csucc :: CppVersion -> CppVersion
Enum, CppVersion -> CppVersion -> Bool
(CppVersion -> CppVersion -> Bool)
-> (CppVersion -> CppVersion -> Bool) -> Eq CppVersion
forall a. (a -> a -> Bool) -> (a -> a -> Bool) -> Eq a
/= :: CppVersion -> CppVersion -> Bool
$c/= :: CppVersion -> CppVersion -> Bool
== :: CppVersion -> CppVersion -> Bool
$c== :: CppVersion -> CppVersion -> Bool
Eq, Eq CppVersion
Eq CppVersion
-> (CppVersion -> CppVersion -> Ordering)
-> (CppVersion -> CppVersion -> Bool)
-> (CppVersion -> CppVersion -> Bool)
-> (CppVersion -> CppVersion -> Bool)
-> (CppVersion -> CppVersion -> Bool)
-> (CppVersion -> CppVersion -> CppVersion)
-> (CppVersion -> CppVersion -> CppVersion)
-> Ord CppVersion
CppVersion -> CppVersion -> Bool
CppVersion -> CppVersion -> Ordering
CppVersion -> CppVersion -> CppVersion
forall a.
Eq a
-> (a -> a -> Ordering)
-> (a -> a -> Bool)
-> (a -> a -> Bool)
-> (a -> a -> Bool)
-> (a -> a -> Bool)
-> (a -> a -> a)
-> (a -> a -> a)
-> Ord a
min :: CppVersion -> CppVersion -> CppVersion
$cmin :: CppVersion -> CppVersion -> CppVersion
max :: CppVersion -> CppVersion -> CppVersion
$cmax :: CppVersion -> CppVersion -> CppVersion
>= :: CppVersion -> CppVersion -> Bool
$c>= :: CppVersion -> CppVersion -> Bool
> :: CppVersion -> CppVersion -> Bool
$c> :: CppVersion -> CppVersion -> Bool
<= :: CppVersion -> CppVersion -> Bool
$c<= :: CppVersion -> CppVersion -> Bool
< :: CppVersion -> CppVersion -> Bool
$c< :: CppVersion -> CppVersion -> Bool
compare :: CppVersion -> CppVersion -> Ordering
$ccompare :: CppVersion -> CppVersion -> Ordering
$cp1Ord :: Eq CppVersion
Ord, Int -> CppVersion -> ShowS
[CppVersion] -> ShowS
CppVersion -> String
(Int -> CppVersion -> ShowS)
-> (CppVersion -> String)
-> ([CppVersion] -> ShowS)
-> Show CppVersion
forall a.
(Int -> a -> ShowS) -> (a -> String) -> ([a] -> ShowS) -> Show a
showList :: [CppVersion] -> ShowS
$cshowList :: [CppVersion] -> ShowS
show :: CppVersion -> String
$cshow :: CppVersion -> String
showsPrec :: Int -> CppVersion -> ShowS
$cshowsPrec :: Int -> CppVersion -> ShowS
Show)
defaultCppVersion :: CppVersion
defaultCppVersion :: CppVersion
defaultCppVersion = CppVersion
Cpp2011
activeCppVersion :: CppVersion
{-# NOINLINE activeCppVersion #-}
activeCppVersion :: CppVersion
activeCppVersion = IO CppVersion -> CppVersion
forall a. IO a -> a
unsafePerformIO (IO CppVersion -> CppVersion) -> IO CppVersion -> CppVersion
forall a b. (a -> b) -> a -> b
$ do
Maybe String
strMaybe <- String -> IO (Maybe String)
lookupEnv String
"HOPPY_CPP_STD"
case Maybe String
strMaybe of
Maybe String
Nothing -> CppVersion -> IO CppVersion
forall (m :: * -> *) a. Monad m => a -> m a
return CppVersion
defaultCppVersion
Just String
"" -> CppVersion -> IO CppVersion
forall (m :: * -> *) a. Monad m => a -> m a
return CppVersion
defaultCppVersion
Just String
"c++98" -> CppVersion -> IO CppVersion
forall (m :: * -> *) a. Monad m => a -> m a
return CppVersion
Cpp1998
Just String
"c++11" -> CppVersion -> IO CppVersion
forall (m :: * -> *) a. Monad m => a -> m a
return CppVersion
Cpp2011
Just String
"c++14" -> CppVersion -> IO CppVersion
forall (m :: * -> *) a. Monad m => a -> m a
return CppVersion
Cpp2014
Just String
str -> do Handle -> String -> IO ()
hPutStrLn Handle
stderr (String -> IO ()) -> String -> IO ()
forall a b. (a -> b) -> a -> b
$ String
"Warning: Invalid HOPPY_CPP_STD value " String -> ShowS
forall a. [a] -> [a] -> [a]
++ ShowS
forall a. Show a => a -> String
show String
str String -> ShowS
forall a. [a] -> [a] -> [a]
++ String
"."
CppVersion -> IO CppVersion
forall (m :: * -> *) a. Monad m => a -> m a
return CppVersion
defaultCppVersion