matlab-0.2.0.0: Foreign/Matlab/Array/Able.hs
{-|
Direct conversion between Haskell data structures and 'IMXData'.
In general, scalars convert to the obvious, and lists to row vectors.
-}
module Foreign.Matlab.Array.Able (
Matlabable (toMatlab, fromMatlab),
withMatlabArray, fromMatlabArray
) where
import Foreign.Matlab.Util
import Foreign.Matlab.Types
import Foreign.Matlab.Array.IMX
class Matlabable a where
toMatlab :: a -> IMXData
fromMatlab :: IMXData -> Maybe a
--instance (MScalar a, IMXArrayElem a) => Matlabable a where { toMatlab = scalarIMX ; fromMatlab = imxScalar }
instance Matlabable Bool where { toMatlab = scalarIMX ; fromMatlab = imxScalar }
instance Matlabable Char where { toMatlab = scalarIMX ; fromMatlab = imxScalar }
instance Matlabable Float where { toMatlab = scalarIMX ; fromMatlab = imxScalar }
instance Matlabable Double where { toMatlab = scalarIMX ; fromMatlab = imxScalar }
instance Matlabable Int where
toMatlab = scalarIMX . (ii :: Int -> MInt32)
fromMatlab = fmap (ii :: MInt32 -> Int) . imxScalar
instance Matlabable String where
toMatlab = listIMX [1,-1]
fromMatlab = imxList
instance Matlabable [Double] where
toMatlab = listIMX [1,-1]
fromMatlab = imxList
instance Matlabable [Int] where
toMatlab = listIMX [1,-1] . map (ii :: Int -> MInt32)
fromMatlab = fmap (map (ii :: MInt32 -> Int)) . imxList
instance Matlabable () where
toMatlab () = IMXNull
fromMatlab IMXNull = Just ()
fromMatlab _ = Nothing
-- |Generate a temporary 'MXArray'
withMatlabArray :: Matlabable a => a -> (MAnyArray -> IO a) -> IO a
withMatlabArray = withIMXData . toMatlab
-- |Convert directly from 'MXArray' (without freeing the original array)
fromMatlabArray :: Matlabable a => MAnyArray -> IO (Maybe a)
fromMatlabArray = fromMatlab .=< imxData