{-# LINE 1 "src/Data/Number/Flint/Flint/Internal/FFI.hsc" #-}
module Data.Number.Flint.Flint.Internal.FFI (
Flint (..)
, CFlint (..)
, printCStr
, printCVec
, CFBitCnt
) where
import Foreign.C.String (CString (..), peekCString)
import Foreign.C.Types
import Foreign.Marshal.Alloc (free)
import Foreign.Marshal.Array (advancePtr)
import Foreign.ForeignPtr
import Foreign.Ptr
import Foreign.Storable
import Control.Monad
import Data.Word
class Flint a where
data CFlint a :: *
printCStr :: (Ptr a -> IO CString) -> Ptr a -> IO CInt
printCStr :: forall a. (Ptr a -> IO CString) -> Ptr a -> IO CInt
printCStr Ptr a -> IO CString
f Ptr a
x = do
CString
cs <- Ptr a -> IO CString
f Ptr a
x
String
s <- CString -> IO String
peekCString CString
cs
forall a. Ptr a -> IO ()
free CString
cs
String -> IO ()
putStr String
s
forall (m :: * -> *) a. Monad m => a -> m a
return CInt
1
printCVec :: Storable a => (Ptr a -> IO CInt) -> Ptr a -> CLong -> IO CInt
printCVec :: forall a.
Storable a =>
(Ptr a -> IO CInt) -> Ptr a -> CLong -> IO CInt
printCVec Ptr a -> IO CInt
f Ptr a
vec CLong
len = do
String -> IO ()
putStr forall a b. (a -> b) -> a -> b
$ forall a. Show a => a -> String
show CLong
len forall a. [a] -> [a] -> [a]
++ String
" "
forall (t :: * -> *) (m :: * -> *) a b.
(Foldable t, Monad m) =>
t a -> (a -> m b) -> m ()
forM_ [Int
0..forall a b. (Integral a, Num b) => a -> b
fromIntegral CLong
len forall a. Num a => a -> a -> a
- Int
1] forall a b. (a -> b) -> a -> b
$ \Int
j -> do
Ptr a -> IO CInt
f (Ptr a
vec forall a. Storable a => Ptr a -> Int -> Ptr a
`advancePtr` Int
j)
String -> IO ()
putStr String
" "
forall (m :: * -> *) a. Monad m => a -> m a
return CInt
1
type CFBitCnt = Word64
{-# LINE 54 "src/Data/Number/Flint/Flint/Internal/FFI.hsc" #-}