Flint2-0.1.0.0: src/Data/Number/Flint/Fmpz/Poly/Q/Instances.hs
{-# OPTIONS_HADDOCK hide, prune, ignore-exports #-}
module Data.Number.Flint.Fmpz.Poly.Q.Instances (
FmpzPolyQ (..)
) where
import Test.QuickCheck
import GHC.Exts
import System.IO.Unsafe
import Control.Monad
import Foreign.Ptr
import Foreign.C.String
import Foreign.Storable
import Foreign.Marshal.Alloc (free)
import Foreign.Marshal.Array (advancePtr)
import Data.Number.Flint.Quotient
import Data.Number.Flint.Fmpz
import Data.Number.Flint.Fmpz.Instances
import Data.Number.Flint.Fmpz.Poly
import Data.Number.Flint.Fmpz.Poly.Factor
import Data.Number.Flint.Fmpz.Poly.Q
instance Show FmpzPolyQ where
show p = snd $ unsafePerformIO $ do
withFmpzPolyQ p $ \p -> do
withCString "x" $ \x -> do
cs <- fmpz_poly_q_get_str_pretty p x
s <- peekCString cs
free cs
return s
instance Quotient FmpzPolyQ FmpzPoly where
(//) x y = fst $ unsafePerformIO $ do
withNewFmpzPolyQ $ \poly -> do
withFmpzPoly x $ \x -> do
withFmpzPoly y $ \y -> do
CFmpzPolyQ p q <- peek poly
fmpz_poly_set p x
fmpz_poly_set q y
numerator q = fst $ unsafePerformIO $ do
withNewFmpzPoly $ \poly -> do
withFmpzPolyQ q $ \q -> do
CFmpzPolyQ num _ <- peek q
fmpz_poly_set poly num
denominator q = fst $ unsafePerformIO $ do
withNewFmpzPoly $ \poly -> do
withFmpzPolyQ q $ \q -> do
CFmpzPolyQ _ den <- peek q
fmpz_poly_set poly den
instance Num FmpzPolyQ where
(*) = lift2 fmpz_poly_q_mul
(+) = lift2 fmpz_poly_q_add
(-) = lift2 fmpz_poly_q_sub
abs = undefined
signum = undefined
fromInteger x = unsafePerformIO $ do
result <- newFmpzPolyQ
withFmpzPolyQ result $ \result ->
fmpz_poly_q_set_si result (fromIntegral x)
return result
instance Eq FmpzPolyQ where
(==) x y = snd $ snd $ unsafePerformIO $ do
withFmpzPolyQ x $ \x ->
withFmpzPolyQ y $ \y -> do
f <- fmpz_poly_q_equal x y
return $ f == 1
instance Ord FmpzPolyQ where
compare = undefined
instance Real FmpzPolyQ where
toRational = undefined
instance Enum FmpzPolyQ where
toEnum = undefined
fromEnum = undefined
lift2 f x y = unsafePerformIO $ do
result <- newFmpzPolyQ
withFmpzPolyQ result $ \result -> do
withFmpzPolyQ x $ \x -> do
withFmpzPolyQ y $ \y -> do
f result x y
return result
lift1 f x = unsafePerformIO $ do
result <- newFmpzPolyQ
withFmpzPolyQ result $ \result ->
withFmpzPolyQ x $ \x ->
f result x
return result