-- |
-- Module      : Data.Array.Accelerate.IO.ByteString
-- Copyright   : [2010..2011] Sean Seefried
--               [2010..2014] Trevor L. McDonell
-- License     : BSD3
--
-- Maintainer  : Trevor L. McDonell <tmcdonell@cse.unsw.edu.au>
-- Stability   : experimental
-- Portability : non-portable (GHC extensions)
--

module Data.Array.Accelerate.IO.ByteString (

  -- ** Data.ByteString
  ByteStrings, fromByteString, toByteString

) where

import Data.Array.Accelerate.IO.BlockCopy
import Data.Array.Accelerate.Array.Sugar


-- | Block copies bytes from a collection of 'ByteString's to freshly allocated
--   Accelerate array.
--
--   The type of elements (@e@) in the output Accelerate array determines the
--   structure of the collection of 'ByteString's that will be required as the
--   second argument to this function. See 'ByteStrings'
--
fromByteString :: (Shape sh, Elt e) => sh -> ByteStrings (EltRepr e) -> IO (Array sh e)
fromByteString sh byteStrings = do
  arr <- allocateArray sh
  let copier = let ((_,f),_,_) = blockCopyFunGenerator arr in f
  copier byteStrings
  return arr


-- | Block copy from an Accelerate array to a collection of freshly allocated
--   'ByteString's.
--
--   The type of elements (@e@) in the input Accelerate array determines the
--   structure of the collection of 'ByteString's that will be output. See
--   'ByteStrings'
--
toByteString :: (Shape sh, Elt e) => Array sh e -> IO (ByteStrings (EltRepr e))
toByteString arr = do
  let copier = let (_,(_,f),_) = blockCopyFunGenerator arr in f
  copier