module Data.SpirV.Enum.AddressingModel 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 AddressingModel = AddressingModel Word32 deriving (Eq, Ord, Storable) pattern Logical :: AddressingModel pattern Logical = AddressingModel 0 pattern Physical32 :: AddressingModel pattern Physical32 = AddressingModel 1 pattern Physical64 :: AddressingModel pattern Physical64 = AddressingModel 2 pattern PhysicalStorageBuffer64 :: AddressingModel pattern PhysicalStorageBuffer64 = AddressingModel 5348 pattern PhysicalStorageBuffer64EXT :: AddressingModel pattern PhysicalStorageBuffer64EXT = AddressingModel 5348 toName :: IsString a => AddressingModel -> a toName x = case x of Logical -> "Logical" Physical32 -> "Physical32" Physical64 -> "Physical64" PhysicalStorageBuffer64 -> "PhysicalStorageBuffer64" PhysicalStorageBuffer64EXT -> "PhysicalStorageBuffer64EXT" unknown -> fromString $ "AddressingModel " ++ show unknown instance Show AddressingModel where show = toName fromName :: (IsString a, Eq a) => a -> Maybe AddressingModel fromName x = case x of "Logical" -> Just Logical "Physical32" -> Just Physical32 "Physical64" -> Just Physical64 "PhysicalStorageBuffer64" -> Just PhysicalStorageBuffer64 "PhysicalStorageBuffer64EXT" -> Just PhysicalStorageBuffer64EXT _unknown -> Nothing instance Read AddressingModel where readPrec = Read.parens do Lex.Ident s <- Read.lexP maybe pfail pure $ fromName s