module BioInf.ViennaRNA.Bindings.FFI.Centroid where
import Data.ByteString.Char8 as BS
import Foreign.C.String
import Foreign.C.Types
import Foreign.Marshal.Alloc
import Foreign.Marshal.Utils
import Foreign.Ptr
import Foreign.Storable
import GHC.Float
import Unsafe.Coerce
import BioInf.ViennaRNA.Bindings.FFI.Utils
ffiCentroidTemp :: Double -> ByteString -> IO (Double,ByteString,Double)
ffiCentroidTemp t inp =
if BS.null inp
then return (0,BS.empty,0)
else useAsCString inp $ \cinp ->
useAsCString inp $ \struc ->
with (0 :: CDouble) $ \dist -> do
e <- if BS.null inp then return 0 else fold_centroid_p (realToFrac t) cinp struc dist
s <- packCString struc
d <- peek dist
return (cd2d e, s, cd2d d)
foreign import ccall "ffiwrap_centroid_temp" fold_centroid_p :: CDouble -> CString -> CString -> Ptr CDouble -> IO CDouble