{-# LANGUAGE ParallelListComp #-}
module Physics.ODE.Utilities where

import Foreign

import Data.Array

forceFinalization :: ForeignPtr a -> IO ()
#ifdef __GLASGOW_HASKELL__
forceFinalization = finalizeForeignPtr
#else
forceFinalization _ = return ()
#endif

peekVector3 :: Storable a => Ptr a -> IO (a,a,a)
peekVector3 ptr
    = do [x,y,z] <- peekArray 3 ptr
         return (x,y,z)

pokeVector3 :: Storable a => Ptr a -> (a,a,a) -> IO ()
pokeVector3 ptr (x,y,z)
    = pokeArray ptr [x,y,z]

peekVector4 :: Storable a => Ptr a -> IO (a,a,a,a)
peekVector4 ptr
    = do [x,y,z,n] <- peekArray 4 ptr
         return (x,y,z,n)

peekMatrix :: Storable a => (Int,Int) -> Ptr a -> IO (Array (Int,Int) a)
peekMatrix (x,y) ptr
    = do elts <- peekArray (x*y) ptr
         return (array ((0,0),(x,y)) [((a,b),e) | e <- elts | a <- [0..x-1], b <- [0..y-1]])