On Thu, Jul 15, 2004 at 04:26:27AM -0700, John Meacham wrote:
> I am thinking a family of routines. (with psuedosignatures)
> 
> copySpan: range -> MArray -> whereto -> MArray -> m ()
> extractSpan : range -> IArray -> IArray
> extractSpanM : range -> MArray -> m IArray
> saveSpan : range -> IArray -> whereto -> MArray -> m ()

I would like to have these, too.  I would especially like to have

    saveSpan :: (Int, Int) -> UArray Int Word8 -> (Int, Int)
                  -> IOUArray Int Word8 -> IO () 
    copySpan :: (Int, Int) -> IOUArray Int Word8 -> (Int, Int)
                  -> IOUArray Int Word8 -> IO ()

to use these in conjunction with hGetArray and hPutArray.

In the hope of advancing the discussion, I have taken up the trivial
task of implementing the above on top of the usual array functions.
(I have not done any testing, though.)  Maybe some kind soul with
knowledge of the ghc innards can provide an implementation that
reduces to a memcpy call, at least for some specializations.

Greetings,

Carsten

-- 
Carsten Schultz (2:38, 33:47), FB Mathematik, FU Berlin
http://carsten.codimi.de/
PGP/GPG key on the pgp.net key servers, 
fingerprint on my home page.
module ArrayCopy(extractSpan, extractSpanM, copySpan, saveSpan) where

import Data.Ix
import Data.Array.IArray
import Data.Array.MArray

-- for specialization:
import Data.Array.IO
import Data.Array.Unboxed
import Data.Word


extractSpan :: (IArray sa e, IArray da e, Ix i) =>
                (i, i) -> sa i e -> da i e

extractSpanM :: (MArray sa e m, IArray da e, Ix i) =>
                (i, i) -> sa i e -> m (da i e)

copySpan :: (MArray sa e m, MArray da e m, Ix i, Ix j) => 
                (i, i) -> sa i e -> (j, j) -> da j e -> m ()

saveSpan :: (IArray sa e, MArray da e m, Ix i, Ix j) => 
                (i, i) -> sa i e -> (j, j) -> da j e -> m ()


extractSpan r a = array r [(i, a!i) | i <- range r]

extractSpanM (r :: (i,i)) (a :: sa i e) =
    do (d :: sa i e) <- newArray_ r
       copySpan r a r d
       unsafeFreeze d

copySpan srcRange srcA destRange destA 
    | rangeSize srcRange == rangeSize destRange 
      = sequence_ [readArray srcA f >>= writeArray destA t
                   | (f,t) <- zip (range srcRange) (range destRange)]

saveSpan srcRange srcA destRange destA 
    | rangeSize srcRange == rangeSize destRange 
      = sequence_ [writeArray destA t (srcA ! f)
                   | (f,t) <- zip (range srcRange) (range destRange)]


{-# specialize 
    saveSpan :: (Int, Int) -> UArray Int Word8 -> (Int, Int)
                  -> IOUArray Int Word8 -> IO ()  #-}
{-# specialize 
    copySpan :: (Int, Int) -> IOUArray Int Word8 -> (Int, Int)
                  -> IOUArray Int Word8 -> IO () #-}
{-# specialize 
    extractSpan :: (Int, Int) -> UArray Int Word8 -> UArray Int Word8 #-}
{-# specialize 
    extractSpanM :: (Int, Int) -> IOUArray Int Word8 -> IO (UArray Int Word8) #-}


Attachment: pgpQlacEJdk2Q.pgp
Description: PGP signature

_______________________________________________
Glasgow-haskell-users mailing list
[EMAIL PROTECTED]
http://www.haskell.org/mailman/listinfo/glasgow-haskell-users

Reply via email to