{-# LANGUAGE TemplateHaskell #-} {-# LANGUAGE BlockArguments #-} {-# LANGUAGE ScopedTypeVariables, RankNTypes, TypeApplications #-} {-# LANGUAGE DataKinds #-} {-# LANGUAGE KindSignatures, TypeOperators #-} {-# LANGUAGE AllowAmbiguousTypes #-} {-# OPTIONS_GHC -Wall -fno-warn-tabs #-} module Gpu.Vulkan.TypeEnum where import Language.Haskell.TH import Data.Bits import Gpu.Vulkan.TypeEnum.Th import qualified Gpu.Vulkan.Enum as E import Gpu.Vulkan.TypeEnum.TypeValues do is <- lines <$> runIO (readFile "th/vkShaderStageFlagBits.txt") (: []) <$> dataD (pure []) (mkName "ShaderStageFlagBits") [] Nothing ((`normalC` []) . mkName <$> is) [] class ShaderStageFlagBitsListToValue (ts :: [ShaderStageFlagBits]) where shaderStageFlagBitsListToValue :: E.ShaderStageFlagBits instance ShaderStageFlagBitsListToValue '[] where shaderStageFlagBitsListToValue :: ShaderStageFlagBits shaderStageFlagBitsListToValue = ShaderStageFlagBits forall a. Bits a => a zeroBits instance (ShaderStageFlagBitsToValue t, ShaderStageFlagBitsListToValue ts) => ShaderStageFlagBitsListToValue (t ': ts) where shaderStageFlagBitsListToValue :: ShaderStageFlagBits shaderStageFlagBitsListToValue = forall (t :: ShaderStageFlagBits). ShaderStageFlagBitsToValue t => ShaderStageFlagBits shaderStageFlagBitsToValue @t ShaderStageFlagBits -> ShaderStageFlagBits -> ShaderStageFlagBits forall a. Bits a => a -> a -> a .|. forall (ts :: [ShaderStageFlagBits]). ShaderStageFlagBitsListToValue ts => ShaderStageFlagBits shaderStageFlagBitsListToValue @ts class ShaderStageFlagBitsToValue (t :: ShaderStageFlagBits) where shaderStageFlagBitsToValue :: E.ShaderStageFlagBits do is <- lines <$> runIO (readFile "th/vkShaderStageFlagBits.txt") sequence $ mkInstance <$> is