Flint2-0.1.0.2: src/Data/Number/Flint/Arb/Poly/Instances.hs
module Data.Number.Flint.Arb.Poly.Instances (
ArbPoly (..)
, module GHC.Exts
) 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.Arb
import Data.Number.Flint.Arb.Instances
import Data.Number.Flint.Arb.Poly
import Data.Number.Flint.UFD
instance Show ArbPoly where
show p = snd $ unsafePerformIO $ do
withArbPoly p $ \p -> do
cs <- arb_poly_get_strd p 16
s <- peekCString cs
free cs
return s
instance IsList ArbPoly where
type Item ArbPoly = Arb
fromList c = unsafePerformIO $ do
p <- newArbPoly
withArbPoly p $ \p ->
forM_ [0..length c-1] $ \j ->
withArb (c!!j) $ \a ->
arb_poly_set_coeff_arb p (fromIntegral j) a
return p
toList p = snd $ unsafePerformIO $
withArbPoly p $ \p -> do
d <- arb_poly_degree p
forM [0..d] $ \j -> do
c <- newArb
withArb c $ \c -> arb_poly_get_coeff_arb c p j
return c
lift2 f x y = unsafePerformIO $ do
result <- newArbPoly
withArbPoly result $ \result -> do
withArbPoly x $ \x -> do
withArbPoly y $ \y -> do
f result x y
return result
lift1 f x = unsafePerformIO $ do
result <- newArbPoly
withArbPoly result $ \result ->
withArbPoly x $ \x ->
f result x
return result