module Data.Binary.Defer.Array( (!), Array, array, elems, arraySize ) where import Data.Array hiding ((!), Array, array, elems) import qualified Data.Array as A import Data.Binary.Defer import Data.Binary.Raw import System.IO.Unsafe import Control.Monad.Reader newtype Array a = Array (A.Array Int a) array :: [a] -> Array a array xs = Array $ listArray (0, length xs - 1) xs (!) :: Array a -> Int -> a (!) (Array a) i = a A.! i elems :: Array a -> [a] elems (Array a) = A.elems a arraySize (Array a) = 1 + y - x where (x,y) = bounds a instance Functor Array where fmap f (Array x) = Array (fmap f x) instance Eq a => Eq (Array a) where Array x == Array y = x == y instance Show a => Show (Array a) where show (Array x) = show x instance BinaryDefer a => BinaryDefer (Array a) where put (Array xs) = putDefer $ do putInt $ snd $ bounds xs mapM_ putFixed (A.elems xs) get = getDefer ans where ans = do n <- getInt h <- asks fst s <- ask i <- lift $ hGetPos h let f j = unsafePerformIO $ do hSetPos h (i + toInteger (sz*j)) runReaderT getFixed s return $ Array $ listArray (0,n) $ map f [0..n] unwrap = undefined :: DeferGet (Array a) -> a sz = size $ unwrap ans