module Main where

-- ghc -prof -auto-all --make -O2 ArrayCopyGetBounds.hs

import Control.Monad( when )
import Data.Array.IO
import Data.Int
--import System.Random

type Arr = IOUArray Int Int64

main = do
--     rg <- getStdGen
    let size    = 50000
        nCopies = 10000
--         vs   = map fromIntegral (randoms rg :: [Int])
    a1 <- newTempArray size
    a2 <- newTempArray size
    doN nCopies (a1 `copyInto` a2)

newTempArray :: Int -> IO Arr
newTempArray len = newArray (0, len-1) 0


copyInto :: Arr -> Arr -> IO ()
copyInto c l = getBounds c >>= uncurry blit
    where
      blit i end = when (i <= end)
                     (do ith <- readArray c i
                         writeArray l i ith
                         blit (i+1) end)

doN n act = go n where go i = when (i > 0) (act >> go (i-1))

