module Data.SpirV.Enum.Dim 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 Dim = Dim Word32 deriving (Eq, Ord, Storable) pattern Dim1D :: Dim pattern Dim1D = Dim 0 pattern Dim2D :: Dim pattern Dim2D = Dim 1 pattern Dim3D :: Dim pattern Dim3D = Dim 2 pattern Cube :: Dim pattern Cube = Dim 3 pattern Rect :: Dim pattern Rect = Dim 4 pattern Buffer :: Dim pattern Buffer = Dim 5 pattern SubpassData :: Dim pattern SubpassData = Dim 6 toName :: IsString a => Dim -> a toName x = case x of Dim1D -> "Dim1D" Dim2D -> "Dim2D" Dim3D -> "Dim3D" Cube -> "Cube" Rect -> "Rect" Buffer -> "Buffer" SubpassData -> "SubpassData" unknown -> fromString $ "Dim " ++ show unknown instance Show Dim where show = toName fromName :: (IsString a, Eq a) => a -> Maybe Dim fromName x = case x of "Dim1D" -> Just Dim1D "Dim2D" -> Just Dim2D "Dim3D" -> Just Dim3D "Cube" -> Just Cube "Rect" -> Just Rect "Buffer" -> Just Buffer "SubpassData" -> Just SubpassData _unknown -> Nothing instance Read Dim where readPrec = Read.parens do Lex.Ident s <- Read.lexP maybe pfail pure $ fromName s