Flint2-0.1.0.2: src/Data/Number/Flint/Fmpz/Mat/Instances.hs
module Data.Number.Flint.Fmpz.Mat.Instances where
import System.IO.Unsafe
import Foreign.C.String
import Foreign.Marshal.Alloc ( free )
import Foreign.Storable
import Data.Number.Flint.Fmpz.Mat
instance Show FmpzMat where
show x = unsafePerformIO $ do
(_, cs) <- withFmpzMat x fmpz_mat_get_str_pretty
s <- peekCString cs
free cs
return s
instance Eq FmpzMat where
(==) x y = unsafePerformIO $ do
(_, (_, flag)) <- withFmpzMat x $ \x -> do
withFmpzMat y $ \y -> do
fmpz_mat_equal x y
return $ flag == 1
instance Num FmpzMat where
(+) = lift2 fmpz_mat_add
(-) = lift2 fmpz_mat_sub
(*) = lift2 fmpz_mat_mul
negate = lift1 fmpz_mat_neg
fromInteger = undefined
signum = undefined
abs = undefined
instance Semigroup FmpzMat where
(<>) = (*)
lift1 f x = unsafePerformIO $ do
(_, (nx, mx)) <- withFmpzMat x $ \x -> do
CFmpzMat _ nx mx _ <- peek x
return (nx, mx)
result <- newFmpzMat nx mx
withFmpzMat x $ \x -> do
withFmpzMat result $ \result -> do
f result x
return result
lift2 f x y = unsafePerformIO $ do
(_, (nx, mx)) <- withFmpzMat x $ \x -> do
CFmpzMat _ nx mx _ <- peek x
return (nx, mx)
(_, (ny, my)) <- withFmpzMat y $ \y -> do
CFmpzMat _ ny my _ <- peek y
return (ny, my)
result <- newFmpzMat nx my
withFmpzMat result $ \z -> do
withFmpzMat x $ \x -> do
withFmpzMat y $ \y -> do
f z x y
return result