module Data.SpirV.Enum.SourceLanguage where import Data.String (IsString(..)) import Data.Word (Word32) import Foreign (Storable(..)) import GHC.Read (Read(..)) import Text.ParserCombinators.ReadPrec (pfail) import qualified GHC.Read as Read import qualified Text.Read.Lex as Lex newtype SourceLanguage = SourceLanguage Word32 deriving (Eq, Ord, Storable) pattern Unknown :: SourceLanguage pattern Unknown = SourceLanguage 0 pattern ESSL :: SourceLanguage pattern ESSL = SourceLanguage 1 pattern GLSL :: SourceLanguage pattern GLSL = SourceLanguage 2 pattern OpenCL_C :: SourceLanguage pattern OpenCL_C = SourceLanguage 3 pattern OpenCL_CPP :: SourceLanguage pattern OpenCL_CPP = SourceLanguage 4 pattern HLSL :: SourceLanguage pattern HLSL = SourceLanguage 5 pattern CPP_for_OpenCL :: SourceLanguage pattern CPP_for_OpenCL = SourceLanguage 6 pattern SYCL :: SourceLanguage pattern SYCL = SourceLanguage 7 toName :: IsString a => SourceLanguage -> a toName x = case x of Unknown -> "Unknown" ESSL -> "ESSL" GLSL -> "GLSL" OpenCL_C -> "OpenCL_C" OpenCL_CPP -> "OpenCL_CPP" HLSL -> "HLSL" CPP_for_OpenCL -> "CPP_for_OpenCL" SYCL -> "SYCL" unknown -> fromString $ "SourceLanguage " ++ show unknown instance Show SourceLanguage where show = toName fromName :: (IsString a, Eq a) => a -> Maybe SourceLanguage fromName x = case x of "Unknown" -> Just Unknown "ESSL" -> Just ESSL "GLSL" -> Just GLSL "OpenCL_C" -> Just OpenCL_C "OpenCL_CPP" -> Just OpenCL_CPP "HLSL" -> Just HLSL "CPP_for_OpenCL" -> Just CPP_for_OpenCL "SYCL" -> Just SYCL _unknown -> Nothing instance Read SourceLanguage where readPrec = Read.parens do Lex.Ident s <- Read.lexP maybe pfail pure $ fromName s