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

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

instance Num FmpzMat where
  + :: FmpzMat -> FmpzMat -> FmpzMat
(+) = (Ptr CFmpzMat -> Ptr CFmpzMat -> Ptr CFmpzMat -> IO ())
-> 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
  (-) = (Ptr CFmpzMat -> Ptr CFmpzMat -> Ptr CFmpzMat -> IO ())
-> 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_sub
  * :: FmpzMat -> FmpzMat -> FmpzMat
(*) = (Ptr CFmpzMat -> Ptr CFmpzMat -> Ptr CFmpzMat -> IO ())
-> 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 = (Ptr CFmpzMat -> Ptr CFmpzMat -> IO ()) -> FmpzMat -> FmpzMat
forall {a}.
(Ptr CFmpzMat -> Ptr CFmpzMat -> IO a) -> FmpzMat -> FmpzMat
lift1 Ptr CFmpzMat -> Ptr CFmpzMat -> IO ()
fmpz_mat_neg
  fromInteger :: Integer -> FmpzMat
fromInteger = Integer -> FmpzMat
forall a. HasCallStack => a
undefined
  signum :: FmpzMat -> FmpzMat
signum = FmpzMat -> FmpzMat
forall a. HasCallStack => a
undefined
  abs :: FmpzMat -> FmpzMat
abs = FmpzMat -> FmpzMat
forall a. HasCallStack => a
undefined

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