@@ -236,12 +236,22 @@ partialCopyM dest didx src sidx count =
236 assert (sidx + count <= length src) .
236 assert (sidx + count <= length src) .
237 assert (didx + count <= length dest) $
237 assert (didx + count <= length dest) $
239− copy_loop sidx didx 0
239+ if srem == 0 && drem == 0
241− copy_loop !i !j !c
243+ (swidx,srem) = sidx `divMod` wordFactor
244+ (dwidx,drem) = didx `divMod` wordFactor
245+ nwds = count `div` wordFactor
247+ | i >= nwds = slow_loop (i * wordFactor)
248+ | otherwise = do w <- unsafeReadWord src (swidx+i)
249+ unsafeWriteWord dest (dwidx+i) w
242− | c >= count = return ()
252+ | i >= count= return ()
243− | otherwise = do unsafeRead src i >>= unsafeWrite dest j
253+ | otherwise = do unsafeRead src (sidx+i) >>= unsafeWrite dest (didx+i)
244− copy_loop (i+1) (j+1) (c+1)
254+ slow_loop (i+1)
246-- | Copy some elements of an immutable array.
256-- | Copy some elements of an immutable array.
247partialCopyI :: MArray s -- ^ Destination
257partialCopyI :: MArray s -- ^ Destination