module Data.Number.Flint.Fmpq.Mat.Instances where

import System.IO.Unsafe

import Foreign.C.String
import Foreign.Marshal.Alloc ( free )
import Foreign.Storable

import Data.Number.Flint.Fmpq.Mat

instance Show FmpqMat where
  show :: FmpqMat -> String
show FmpqMat
x = forall a. IO a -> a
unsafePerformIO forall a b. (a -> b) -> a -> b
$ do
    (FmpqMat
_, CString
cs) <- forall {a}. FmpqMat -> (Ptr CFmpqMat -> IO a) -> IO (FmpqMat, a)
withFmpqMat FmpqMat
x Ptr CFmpqMat -> IO CString
fmpq_mat_get_str
    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 FmpqMat where
  == :: FmpqMat -> FmpqMat -> Bool
(==) FmpqMat
x FmpqMat
y = forall a. IO a -> a
unsafePerformIO forall a b. (a -> b) -> a -> b
$ do
    (FmpqMat
_, (FmpqMat
_, CInt
flag)) <- forall {a}. FmpqMat -> (Ptr CFmpqMat -> IO a) -> IO (FmpqMat, a)
withFmpqMat FmpqMat
x forall a b. (a -> b) -> a -> b
$ \Ptr CFmpqMat
x -> do
      forall {a}. FmpqMat -> (Ptr CFmpqMat -> IO a) -> IO (FmpqMat, a)
withFmpqMat FmpqMat
y forall a b. (a -> b) -> a -> b
$ \Ptr CFmpqMat
y -> do
        Ptr CFmpqMat -> Ptr CFmpqMat -> IO CInt
fmpq_mat_equal Ptr CFmpqMat
x Ptr CFmpqMat
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 FmpqMat where
  + :: FmpqMat -> FmpqMat -> FmpqMat
(+) = forall {a}.
(Ptr CFmpqMat -> Ptr CFmpqMat -> Ptr CFmpqMat -> IO a)
-> FmpqMat -> FmpqMat -> FmpqMat
lift2 Ptr CFmpqMat -> Ptr CFmpqMat -> Ptr CFmpqMat -> IO ()
fmpq_mat_add
  (-) = forall {a}.
(Ptr CFmpqMat -> Ptr CFmpqMat -> Ptr CFmpqMat -> IO a)
-> FmpqMat -> FmpqMat -> FmpqMat
lift2 Ptr CFmpqMat -> Ptr CFmpqMat -> Ptr CFmpqMat -> IO ()
fmpq_mat_sub
  * :: FmpqMat -> FmpqMat -> FmpqMat
(*) = forall {a}.
(Ptr CFmpqMat -> Ptr CFmpqMat -> Ptr CFmpqMat -> IO a)
-> FmpqMat -> FmpqMat -> FmpqMat
lift2 Ptr CFmpqMat -> Ptr CFmpqMat -> Ptr CFmpqMat -> IO ()
fmpq_mat_mul
  negate :: FmpqMat -> FmpqMat
negate = forall {a}.
(Ptr CFmpqMat -> Ptr CFmpqMat -> IO a) -> FmpqMat -> FmpqMat
lift1 Ptr CFmpqMat -> Ptr CFmpqMat -> IO ()
fmpq_mat_neg
  fromInteger :: Integer -> FmpqMat
fromInteger = forall a. HasCallStack => a
undefined
  signum :: FmpqMat -> FmpqMat
signum = forall a. HasCallStack => a
undefined
  abs :: FmpqMat -> FmpqMat
abs = forall a. HasCallStack => a
undefined

instance Fractional FmpqMat where
  recip :: FmpqMat -> FmpqMat
recip FmpqMat
x = forall a. IO a -> a
unsafePerformIO forall a b. (a -> b) -> a -> b
$ do
    (FmpqMat
_, (CLong
nx, CLong
mx)) <- forall {a}. FmpqMat -> (Ptr CFmpqMat -> IO a) -> IO (FmpqMat, a)
withFmpqMat FmpqMat
x forall a b. (a -> b) -> a -> b
$ \Ptr CFmpqMat
x -> do
      CFmpqMat Ptr CFmpq
_ CLong
nx CLong
mx Ptr (Ptr CFmpq)
_ <- forall a. Storable a => Ptr a -> IO a
peek Ptr CFmpqMat
x
      forall (m :: * -> *) a. Monad m => a -> m a
return (CLong
nx, CLong
mx)
    FmpqMat
result <- CLong -> CLong -> IO FmpqMat
newFmpqMat CLong
nx CLong
mx
    (FmpqMat
_, (FmpqMat
_, CInt
flag)) <- forall {a}. FmpqMat -> (Ptr CFmpqMat -> IO a) -> IO (FmpqMat, a)
withFmpqMat FmpqMat
x forall a b. (a -> b) -> a -> b
$ \Ptr CFmpqMat
x -> do
      forall {a}. FmpqMat -> (Ptr CFmpqMat -> IO a) -> IO (FmpqMat, a)
withFmpqMat FmpqMat
result forall a b. (a -> b) -> a -> b
$ \Ptr CFmpqMat
result -> do
        CInt
flag <- Ptr CFmpqMat -> Ptr CFmpqMat -> IO CInt
fmpq_mat_inv Ptr CFmpqMat
result Ptr CFmpqMat
x
        forall (m :: * -> *) a. Monad m => a -> m a
return CInt
flag
    forall (m :: * -> *) a. Monad m => a -> m a
return FmpqMat
result
  fromRational :: Rational -> FmpqMat
fromRational = forall a. HasCallStack => a
undefined

instance Semigroup FmpqMat where
  <> :: FmpqMat -> FmpqMat -> FmpqMat
(<>) = forall a. Num a => a -> a -> a
(*)
  
lift1 :: (Ptr CFmpqMat -> Ptr CFmpqMat -> IO a) -> FmpqMat -> FmpqMat
lift1 Ptr CFmpqMat -> Ptr CFmpqMat -> IO a
f FmpqMat
x = forall a. IO a -> a
unsafePerformIO forall a b. (a -> b) -> a -> b
$ do
  (FmpqMat
_, (CLong
nx, CLong
mx)) <- forall {a}. FmpqMat -> (Ptr CFmpqMat -> IO a) -> IO (FmpqMat, a)
withFmpqMat FmpqMat
x forall a b. (a -> b) -> a -> b
$ \Ptr CFmpqMat
x -> do
    CFmpqMat Ptr CFmpq
_ CLong
nx CLong
mx Ptr (Ptr CFmpq)
_ <- forall a. Storable a => Ptr a -> IO a
peek Ptr CFmpqMat
x
    forall (m :: * -> *) a. Monad m => a -> m a
return (CLong
nx, CLong
mx)
  FmpqMat
result <- CLong -> CLong -> IO FmpqMat
newFmpqMat CLong
nx CLong
mx
  forall {a}. FmpqMat -> (Ptr CFmpqMat -> IO a) -> IO (FmpqMat, a)
withFmpqMat FmpqMat
x forall a b. (a -> b) -> a -> b
$ \Ptr CFmpqMat
x -> do
    forall {a}. FmpqMat -> (Ptr CFmpqMat -> IO a) -> IO (FmpqMat, a)
withFmpqMat FmpqMat
result forall a b. (a -> b) -> a -> b
$ \Ptr CFmpqMat
result -> do
      Ptr CFmpqMat -> Ptr CFmpqMat -> IO a
f Ptr CFmpqMat
result Ptr CFmpqMat
x
  forall (m :: * -> *) a. Monad m => a -> m a
return FmpqMat
result
    
lift2 :: (Ptr CFmpqMat -> Ptr CFmpqMat -> Ptr CFmpqMat -> IO a)
-> FmpqMat -> FmpqMat -> FmpqMat
lift2 Ptr CFmpqMat -> Ptr CFmpqMat -> Ptr CFmpqMat -> IO a
f FmpqMat
x FmpqMat
y = forall a. IO a -> a
unsafePerformIO forall a b. (a -> b) -> a -> b
$ do
  (FmpqMat
_, (CLong
nx, CLong
mx)) <- forall {a}. FmpqMat -> (Ptr CFmpqMat -> IO a) -> IO (FmpqMat, a)
withFmpqMat FmpqMat
x forall a b. (a -> b) -> a -> b
$ \Ptr CFmpqMat
x -> do
    CFmpqMat Ptr CFmpq
_ CLong
nx CLong
mx Ptr (Ptr CFmpq)
_ <- forall a. Storable a => Ptr a -> IO a
peek Ptr CFmpqMat
x
    forall (m :: * -> *) a. Monad m => a -> m a
return (CLong
nx, CLong
mx)
  (FmpqMat
_, (CLong
ny, CLong
my)) <- forall {a}. FmpqMat -> (Ptr CFmpqMat -> IO a) -> IO (FmpqMat, a)
withFmpqMat FmpqMat
y forall a b. (a -> b) -> a -> b
$ \Ptr CFmpqMat
y -> do 
     CFmpqMat Ptr CFmpq
_ CLong
ny CLong
my Ptr (Ptr CFmpq)
_ <- forall a. Storable a => Ptr a -> IO a
peek Ptr CFmpqMat
y
     forall (m :: * -> *) a. Monad m => a -> m a
return (CLong
ny, CLong
my)
  FmpqMat
result <- CLong -> CLong -> IO FmpqMat
newFmpqMat CLong
nx CLong
my
  forall {a}. FmpqMat -> (Ptr CFmpqMat -> IO a) -> IO (FmpqMat, a)
withFmpqMat FmpqMat
result forall a b. (a -> b) -> a -> b
$ \Ptr CFmpqMat
z -> do
    forall {a}. FmpqMat -> (Ptr CFmpqMat -> IO a) -> IO (FmpqMat, a)
withFmpqMat FmpqMat
x forall a b. (a -> b) -> a -> b
$ \Ptr CFmpqMat
x -> do
      forall {a}. FmpqMat -> (Ptr CFmpqMat -> IO a) -> IO (FmpqMat, a)
withFmpqMat FmpqMat
y forall a b. (a -> b) -> a -> b
$ \Ptr CFmpqMat
y -> do
        Ptr CFmpqMat -> Ptr CFmpqMat -> Ptr CFmpqMat -> IO a
f Ptr CFmpqMat
z Ptr CFmpqMat
x Ptr CFmpqMat
y
  forall (m :: * -> *) a. Monad m => a -> m a
return FmpqMat
result