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