module Data.Number.Flint.NF.Fmpzi.Instances where

import System.IO.Unsafe
import Foreign.C.String
import Foreign.Marshal.Alloc ( free )

import Data.Number.Flint.NF.Fmpzi

instance Show Fmpzi where
  show :: Fmpzi -> String
show Fmpzi
x = forall a. IO a -> a
unsafePerformIO forall a b. (a -> b) -> a -> b
$ do
    (Fmpzi
_, CString
cs) <- forall {a}. Fmpzi -> (Ptr CFmpzi -> IO a) -> IO (Fmpzi, a)
withFmpzi Fmpzi
x Ptr CFmpzi -> IO CString
fmpzi_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 Fmpzi where
  == :: Fmpzi -> Fmpzi -> Bool
(==) Fmpzi
x Fmpzi
y = forall a b. (a, b) -> b
snd forall a b. (a -> b) -> a -> b
$ forall a b. (a, b) -> b
snd forall a b. (a -> b) -> a -> b
$ forall a. IO a -> a
unsafePerformIO forall a b. (a -> b) -> a -> b
$ 
    forall {a}. Fmpzi -> (Ptr CFmpzi -> IO a) -> IO (Fmpzi, a)
withFmpzi Fmpzi
x forall a b. (a -> b) -> a -> b
$ \Ptr CFmpzi
x ->
      forall {a}. Fmpzi -> (Ptr CFmpzi -> IO a) -> IO (Fmpzi, a)
withFmpzi Fmpzi
y forall a b. (a -> b) -> a -> b
$ \Ptr CFmpzi
y -> do
        CInt
result <- Ptr CFmpzi -> Ptr CFmpzi -> IO CInt
fmpzi_equal Ptr CFmpzi
x Ptr CFmpzi
y
        forall (m :: * -> *) a. Monad m => a -> m a
return forall a b. (a -> b) -> a -> b
$ CInt
result forall a. Eq a => a -> a -> Bool
== CInt
1

instance Num Fmpzi where
  {-# INLINE (+) #-}
  + :: Fmpzi -> Fmpzi -> Fmpzi
(+) = forall {a}.
(Ptr CFmpzi -> Ptr CFmpzi -> Ptr CFmpzi -> IO a)
-> Fmpzi -> Fmpzi -> Fmpzi
lift2 Ptr CFmpzi -> Ptr CFmpzi -> Ptr CFmpzi -> IO ()
fmpzi_add
  {-# INLINE (-) #-}
  (-) = forall {a}.
(Ptr CFmpzi -> Ptr CFmpzi -> Ptr CFmpzi -> IO a)
-> Fmpzi -> Fmpzi -> Fmpzi
lift2 Ptr CFmpzi -> Ptr CFmpzi -> Ptr CFmpzi -> IO ()
fmpzi_sub
  {-# INLINE (*) #-}
  * :: Fmpzi -> Fmpzi -> Fmpzi
(*) = forall {a}.
(Ptr CFmpzi -> Ptr CFmpzi -> Ptr CFmpzi -> IO a)
-> Fmpzi -> Fmpzi -> Fmpzi
lift2 Ptr CFmpzi -> Ptr CFmpzi -> Ptr CFmpzi -> IO ()
fmpzi_mul
  negate :: Fmpzi -> Fmpzi
negate = forall {a}. (Ptr CFmpzi -> Ptr CFmpzi -> IO a) -> Fmpzi -> Fmpzi
lift1 Ptr CFmpzi -> Ptr CFmpzi -> IO ()
fmpzi_neg
  abs :: Fmpzi -> Fmpzi
abs    = forall a. HasCallStack => a
undefined
  fromInteger :: Integer -> Fmpzi
fromInteger Integer
x = forall a. IO a -> a
unsafePerformIO forall a b. (a -> b) -> a -> b
$ do
    Fmpzi
result <- IO Fmpzi
newFmpzi
    forall {a}. Fmpzi -> (Ptr CFmpzi -> IO a) -> IO (Fmpzi, a)
withFmpzi Fmpzi
result forall a b. (a -> b) -> a -> b
$ \Ptr CFmpzi
result -> do
      Ptr CFmpzi -> CLong -> CLong -> IO ()
fmpzi_set_si_si Ptr CFmpzi
result (forall a. Num a => Integer -> a
fromInteger Integer
x) CLong
1
    forall (m :: * -> *) a. Monad m => a -> m a
return Fmpzi
result
  signum :: Fmpzi -> Fmpzi
signum = forall a. HasCallStack => a
undefined

lift1 :: (Ptr CFmpzi -> Ptr CFmpzi -> IO a) -> Fmpzi -> Fmpzi
lift1 Ptr CFmpzi -> Ptr CFmpzi -> IO a
f Fmpzi
x = forall a b. (a, b) -> a
fst forall a b. (a -> b) -> a -> b
$ forall a. IO a -> a
unsafePerformIO forall a b. (a -> b) -> a -> b
$ 
  forall {a}. (Ptr CFmpzi -> IO a) -> IO (Fmpzi, a)
withNewFmpzi forall a b. (a -> b) -> a -> b
$ \Ptr CFmpzi
result -> 
    forall {a}. Fmpzi -> (Ptr CFmpzi -> IO a) -> IO (Fmpzi, a)
withFmpzi Fmpzi
x forall a b. (a -> b) -> a -> b
$ \Ptr CFmpzi
x ->
      Ptr CFmpzi -> Ptr CFmpzi -> IO a
f Ptr CFmpzi
result Ptr CFmpzi
x
  
lift2 :: (Ptr CFmpzi -> Ptr CFmpzi -> Ptr CFmpzi -> IO a)
-> Fmpzi -> Fmpzi -> Fmpzi
lift2 Ptr CFmpzi -> Ptr CFmpzi -> Ptr CFmpzi -> IO a
f Fmpzi
x Fmpzi
y = forall a b. (a, b) -> a
fst forall a b. (a -> b) -> a -> b
$ forall a. IO a -> a
unsafePerformIO forall a b. (a -> b) -> a -> b
$ 
  forall {a}. (Ptr CFmpzi -> IO a) -> IO (Fmpzi, a)
withNewFmpzi forall a b. (a -> b) -> a -> b
$ \Ptr CFmpzi
result ->
    forall {a}. Fmpzi -> (Ptr CFmpzi -> IO a) -> IO (Fmpzi, a)
withFmpzi Fmpzi
x forall a b. (a -> b) -> a -> b
$ \Ptr CFmpzi
x ->
      forall {a}. Fmpzi -> (Ptr CFmpzi -> IO a) -> IO (Fmpzi, a)
withFmpzi Fmpzi
y forall a b. (a -> b) -> a -> b
$ \Ptr CFmpzi
y ->
        Ptr CFmpzi -> Ptr CFmpzi -> Ptr CFmpzi -> IO a
f Ptr CFmpzi
result Ptr CFmpzi
x Ptr CFmpzi
y