{-# LANGUAGE FlexibleInstances #-}
{-# LANGUAGE MultiWayIf        #-}

module HaskellWorks.Data.Simd.Comparison
  ( CmpEqWord8s(..)
  ) where

import Data.Word
import HaskellWorks.Data.Simd.Capabilities

import qualified Data.Vector.Storable                    as DVS
import qualified HaskellWorks.Data.Simd.Comparison.Avx2  as AVX2
import qualified HaskellWorks.Data.Simd.Comparison.Stock as STOCK

class CmpEqWord8s a where
  cmpEqWord8s :: Word8 -> a -> a

instance CmpEqWord8s (DVS.Vector Word64) where
  cmpEqWord8s w bs = if
    | avx2Enabled -> AVX2.cmpEqWord8s  w bs
    | True        -> STOCK.cmpEqWord8s w bs
  {-# INLINE cmpEqWord8s #-}

instance CmpEqWord8s (DVS.Vector Word8) where
  cmpEqWord8s w bs = if
    | avx2Enabled -> AVX2.cmpEqWord8s  w bs
    | True        -> STOCK.cmpEqWord8s w bs
  {-# INLINE cmpEqWord8s #-}

instance CmpEqWord8s [DVS.Vector Word64] where
  cmpEqWord8s w bs = if
    | avx2Enabled -> AVX2.cmpEqWord8s  w bs
    | True        -> STOCK.cmpEqWord8s w bs
  {-# INLINE cmpEqWord8s #-}

instance CmpEqWord8s [DVS.Vector Word8] where
  cmpEqWord8s w bs = if
    | avx2Enabled -> AVX2.cmpEqWord8s  w bs
    | True        -> STOCK.cmpEqWord8s w bs
  {-# INLINE cmpEqWord8s #-}