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 :: FmpzMat -> String
show FmpzMat
x = forall a. IO a -> a
unsafePerformIO forall a b. (a -> b) -> a -> b
$ do
    (FmpzMat
_, CString
cs) <- forall {a}. FmpzMat -> (Ptr CFmpzMat -> IO a) -> IO (FmpzMat, a)
withFmpzMat FmpzMat
x Ptr CFmpzMat -> IO CString
fmpz_mat_get_str_pretty
    String
s <- CString -> IO String
peekCString CString
cs
    forall a. Ptr a -> IO ()
free CString
cs
    forall (m :: * -> *) a. Monad m => a -> m a
return String
s

instance Eq FmpzMat where
  == :: FmpzMat -> FmpzMat -> Bool
(==) FmpzMat
x FmpzMat
y = forall a. IO a -> a
unsafePerformIO forall a b. (a -> b) -> a -> b
$ do
    (FmpzMat
_, (FmpzMat
_, CInt
flag)) <- forall {a}. FmpzMat -> (Ptr CFmpzMat -> IO a) -> IO (FmpzMat, a)
withFmpzMat FmpzMat
x forall a b. (a -> b) -> a -> b
$ \Ptr CFmpzMat
x -> do
      forall {a}. FmpzMat -> (Ptr CFmpzMat -> IO a) -> IO (FmpzMat, a)
withFmpzMat FmpzMat
y forall a b. (a -> b) -> a -> b
$ \Ptr CFmpzMat
y -> do
        Ptr CFmpzMat -> Ptr CFmpzMat -> IO CInt
fmpz_mat_equal Ptr CFmpzMat
x Ptr CFmpzMat
y
    forall (m :: * -> *) a. Monad m => a -> m a
return forall a b. (a -> b) -> a -> b
$ CInt
flag forall a. Eq a => a -> a -> Bool
== CInt
1

instance Num FmpzMat where
  + :: FmpzMat -> FmpzMat -> FmpzMat
(+) = forall {a}.
(Ptr CFmpzMat -> Ptr CFmpzMat -> Ptr CFmpzMat -> IO a)
-> FmpzMat -> FmpzMat -> FmpzMat
lift2 Ptr CFmpzMat -> Ptr CFmpzMat -> Ptr CFmpzMat -> IO ()
fmpz_mat_add
  (-) = forall {a}.
(Ptr CFmpzMat -> Ptr CFmpzMat -> Ptr CFmpzMat -> IO a)
-> FmpzMat -> FmpzMat -> FmpzMat
lift2 Ptr CFmpzMat -> Ptr CFmpzMat -> Ptr CFmpzMat -> IO ()
fmpz_mat_sub
  * :: FmpzMat -> FmpzMat -> FmpzMat
(*) = forall {a}.
(Ptr CFmpzMat -> Ptr CFmpzMat -> Ptr CFmpzMat -> IO a)
-> FmpzMat -> FmpzMat -> FmpzMat
lift2 Ptr CFmpzMat -> Ptr CFmpzMat -> Ptr CFmpzMat -> IO ()
fmpz_mat_mul
  negate :: FmpzMat -> FmpzMat
negate = forall {a}.
(Ptr CFmpzMat -> Ptr CFmpzMat -> IO a) -> FmpzMat -> FmpzMat
lift1 Ptr CFmpzMat -> Ptr CFmpzMat -> IO ()
fmpz_mat_neg
  fromInteger :: Integer -> FmpzMat
fromInteger = forall a. HasCallStack => a
undefined
  signum :: FmpzMat -> FmpzMat
signum = forall a. HasCallStack => a
undefined
  abs :: FmpzMat -> FmpzMat
abs = forall a. HasCallStack => a
undefined

instance Semigroup FmpzMat where
  <> :: FmpzMat -> FmpzMat -> FmpzMat
(<>) = forall a. Num a => a -> a -> a
(*)

lift1 :: (Ptr CFmpzMat -> Ptr CFmpzMat -> IO a) -> FmpzMat -> FmpzMat
lift1 Ptr CFmpzMat -> Ptr CFmpzMat -> IO a
f FmpzMat
x = forall a. IO a -> a
unsafePerformIO forall a b. (a -> b) -> a -> b
$ do
  (FmpzMat
_, (CLong
nx, CLong
mx)) <- forall {a}. FmpzMat -> (Ptr CFmpzMat -> IO a) -> IO (FmpzMat, a)
withFmpzMat FmpzMat
x forall a b. (a -> b) -> a -> b
$ \Ptr CFmpzMat
x -> do
    CFmpzMat Ptr CFmpz
_ CLong
nx CLong
mx Ptr (Ptr CFmpz)
_ <- forall a. Storable a => Ptr a -> IO a
peek Ptr CFmpzMat
x
    forall (m :: * -> *) a. Monad m => a -> m a
return (CLong
nx, CLong
mx)
  FmpzMat
result <- CLong -> CLong -> IO FmpzMat
newFmpzMat CLong
nx CLong
mx
  forall {a}. FmpzMat -> (Ptr CFmpzMat -> IO a) -> IO (FmpzMat, a)
withFmpzMat FmpzMat
x forall a b. (a -> b) -> a -> b
$ \Ptr CFmpzMat
x -> do
    forall {a}. FmpzMat -> (Ptr CFmpzMat -> IO a) -> IO (FmpzMat, a)
withFmpzMat FmpzMat
result forall a b. (a -> b) -> a -> b
$ \Ptr CFmpzMat
result -> do
      Ptr CFmpzMat -> Ptr CFmpzMat -> IO a
f Ptr CFmpzMat
result Ptr CFmpzMat
x
  forall (m :: * -> *) a. Monad m => a -> m a
return FmpzMat
result
    
lift2 :: (Ptr CFmpzMat -> Ptr CFmpzMat -> Ptr CFmpzMat -> IO a)
-> FmpzMat -> FmpzMat -> FmpzMat
lift2 Ptr CFmpzMat -> Ptr CFmpzMat -> Ptr CFmpzMat -> IO a
f FmpzMat
x FmpzMat
y = forall a. IO a -> a
unsafePerformIO forall a b. (a -> b) -> a -> b
$ do
  (FmpzMat
_, (CLong
nx, CLong
mx)) <- forall {a}. FmpzMat -> (Ptr CFmpzMat -> IO a) -> IO (FmpzMat, a)
withFmpzMat FmpzMat
x forall a b. (a -> b) -> a -> b
$ \Ptr CFmpzMat
x -> do
    CFmpzMat Ptr CFmpz
_ CLong
nx CLong
mx Ptr (Ptr CFmpz)
_ <- forall a. Storable a => Ptr a -> IO a
peek Ptr CFmpzMat
x
    forall (m :: * -> *) a. Monad m => a -> m a
return (CLong
nx, CLong
mx)
  (FmpzMat
_, (CLong
ny, CLong
my)) <- forall {a}. FmpzMat -> (Ptr CFmpzMat -> IO a) -> IO (FmpzMat, a)
withFmpzMat FmpzMat
y forall a b. (a -> b) -> a -> b
$ \Ptr CFmpzMat
y -> do 
     CFmpzMat Ptr CFmpz
_ CLong
ny CLong
my Ptr (Ptr CFmpz)
_ <- forall a. Storable a => Ptr a -> IO a
peek Ptr CFmpzMat
y
     forall (m :: * -> *) a. Monad m => a -> m a
return (CLong
ny, CLong
my)
  FmpzMat
result <- CLong -> CLong -> IO FmpzMat
newFmpzMat CLong
nx CLong
my
  forall {a}. FmpzMat -> (Ptr CFmpzMat -> IO a) -> IO (FmpzMat, a)
withFmpzMat FmpzMat
result forall a b. (a -> b) -> a -> b
$ \Ptr CFmpzMat
z -> do
    forall {a}. FmpzMat -> (Ptr CFmpzMat -> IO a) -> IO (FmpzMat, a)
withFmpzMat FmpzMat
x forall a b. (a -> b) -> a -> b
$ \Ptr CFmpzMat
x -> do
      forall {a}. FmpzMat -> (Ptr CFmpzMat -> IO a) -> IO (FmpzMat, a)
withFmpzMat FmpzMat
y forall a b. (a -> b) -> a -> b
$ \Ptr CFmpzMat
y -> do
        Ptr CFmpzMat -> Ptr CFmpzMat -> Ptr CFmpzMat -> IO a
f Ptr CFmpzMat
z Ptr CFmpzMat
x Ptr CFmpzMat
y
  forall (m :: * -> *) a. Monad m => a -> m a
return FmpzMat
result