{-# OPTIONS_GHC -fno-warn-orphans    #-}
{-# LANGUAGE    UndecidableInstances #-}
module Data.Repa.Array.Material.Auto.InstWord
where
import Data.Repa.Array.Material.Auto.Base       as A
import Data.Repa.Array.Material.Boxed           as A
import Data.Repa.Array.Material.Foreign         as A
import Data.Repa.Array.Generic.Convert          as A
import Data.Repa.Array.Meta.Window              as A
import Data.Repa.Array.Internals.Bulk           as A
import Data.Repa.Array.Internals.Target         as A
import Data.Repa.Array.Internals.Layout         as A
import Data.Word
import Control.Monad
#include "repa-array.h"


--------------------------------------------------------------------------------------------- Word8
instance Bulk A Word8 where
 data Array A Word8              = AArray_Word8 !(Array F Word8)
 layout (AArray_Word8 arr)       = Auto (A.length arr)
 index  (AArray_Word8 arr) ix    = A.index arr ix
 {-# INLINE_ARRAY layout #-}
 {-# INLINE_ARRAY index  #-}


deriving instance Show (Array A Word8)

instance Convert F Word8 A Word8 where
 convert arr = AArray_Word8 arr
 {-# INLINE_ARRAY convert #-}

instance Convert A Word8 F Word8 where
 convert (AArray_Word8 arr) = arr
 {-# INLINE_ARRAY convert #-}

instance Windowable A Word8 where
 window st len (AArray_Word8 arr) 
  = AArray_Word8 (window st len arr)
 {-# INLINE_ARRAY window #-}

instance Target A Word8 where
 data Buffer A Word8            
  = ABuffer_Word8 !(Buffer F Word8)

 unsafeNewBuffer (Auto len)     
  = liftM ABuffer_Word8 $ unsafeNewBuffer (Foreign len)
 {-# INLINE_ARRAY unsafeNewBuffer #-}

 unsafeReadBuffer   (ABuffer_Word8 arr) ix
  = unsafeReadBuffer arr ix
 {-# INLINE_ARRAY unsafeReadBuffer #-}

 unsafeWriteBuffer  (ABuffer_Word8 arr) ix x
  = unsafeWriteBuffer arr ix x
 {-# INLINE_ARRAY unsafeWriteBuffer #-}

 unsafeGrowBuffer   (ABuffer_Word8 arr) bump
  = liftM ABuffer_Word8 $ unsafeGrowBuffer arr bump
 {-# INLINE_ARRAY unsafeGrowBuffer #-}

 unsafeFreezeBuffer (ABuffer_Word8 arr)
  = liftM AArray_Word8  $ unsafeFreezeBuffer arr 
 {-# INLINE_ARRAY unsafeFreezeBuffer #-}

 unsafeThawBuffer   (AArray_Word8 arr)
  = liftM ABuffer_Word8 $ unsafeThawBuffer  arr
 {-# INLINE_ARRAY unsafeThawBuffer #-}

 unsafeSliceBuffer st len (ABuffer_Word8 buf)
  = liftM ABuffer_Word8 $ unsafeSliceBuffer st len buf
 {-# INLINE_ARRAY unsafeSliceBuffer #-}

 touchBuffer (ABuffer_Word8 buf)
  = touchBuffer buf
 {-# INLINE_ARRAY touchBuffer #-}

 bufferLayout (ABuffer_Word8 buf)
  = Auto $ A.extent $ bufferLayout buf
 {-# INLINE_ARRAY bufferLayout #-}