repa-array-4.0.0.1: Data/Repa/Eval/Array.hs
module Data.Repa.Eval.Array
( -- * Array Targets
Target (..), TargetI
, IOBuffer
-- * Array Loading
, Load (..)
, computeS
, computeIntoS)
where
import Data.Repa.Array.Internals.Target as A
import Data.Repa.Array.Internals.Load as A
import Data.Repa.Array.Internals.Bulk as A
import Data.Repa.Array.Index as A
import System.IO.Unsafe
#include "repa-array.h"
-- | Sequential computation of delayed array elements.
--
-- Elements of the source array are computed sequentially and
-- written to a new array of the specified layout.
--
computeS :: (Load lSrc lDst a, Index lSrc ~ Index lDst)
=> Name lDst -> Array lSrc a -> Array lDst a
computeS !nDst !aSrc
= let !lDst = create nDst (extent $ layout aSrc)
Just aDst = computeIntoS lDst aSrc
in aDst `seq` aDst
{-# INLINE computeS #-}
-- | Like `computeS` but use the provided desination layout.
--
-- The size of the destination layout must match the size of the source
-- array, else `Nothing`.
--
computeIntoS :: Load lSrc lDst a
=> lDst -> Array lSrc a -> Maybe (Array lDst a)
computeIntoS !lDst !aSrc
| (A.size $ A.extent lDst) == A.length aSrc
= unsafePerformIO
$ do !buf <- unsafeNewBuffer lDst
loadS aSrc buf
!arr <- unsafeFreezeBuffer buf
return $ Just arr
| otherwise
= Nothing
{-# INLINE_ARRAY computeIntoS #-}