packages feed

fir-0.1.0.0: src/SPIRV/Groups.hs

{-# LANGUAGE DerivingVia           #-}
{-# LANGUAGE GADTs                 #-}
{-# LANGUAGE TypeApplications      #-}
{-# LANGUAGE TypeFamilies          #-}
{-# LANGUAGE DataKinds             #-}
{-# LANGUAGE MultiParamTypeClasses #-}

{-|
Module: SPIRV.Groups

This module defines @SPIR-V@ group operations.
-}

module SPIRV.Groups
  ( GroupOperation(..)
  , groupOperationToWord32
  ) where

-- base
import Data.Word
  ( Word32 )

-- fir
import Data.Binary.Class.Put
  ( Put(..), PutWord32Enum(..) )
import Data.Type.Known
  ( Demotable(Demote), Known(known) )  

-------------------------------------------------------------------------------

data GroupOperation
  = Reduce
  | InclusiveScan
  | ExclusiveScan
  | ClusteredReduce
  deriving stock ( Show, Eq, Ord, Enum )
  deriving Put via ( PutWord32Enum GroupOperation )

groupOperationToWord32 :: GroupOperation -> Word32
groupOperationToWord32 = fromIntegral . fromEnum

instance Demotable GroupOperation where
  type Demote GroupOperation = GroupOperation

instance Known GroupOperation 'Reduce where
  known = Reduce
instance Known GroupOperation 'InclusiveScan where
  known = InclusiveScan
instance Known GroupOperation 'ExclusiveScan where
  known = ExclusiveScan
instance Known GroupOperation 'ClusteredReduce where
  known = ClusteredReduce