-- GENERATED by C->Haskell Compiler, version 0.28.1 Switcheroo, 1 April 2016 (Haskell)
-- Edit the ORIGNAL .chs file instead!


{-# LINE 1 "./BioInf/ViennaRNA/Bindings/FFI/Fold.chs" #-}

module BioInf.ViennaRNA.Bindings.FFI.Fold where
import qualified Foreign.C.Types as C2HSImp
import qualified Foreign.Ptr as C2HSImp



import Data.ByteString.Char8 as BS
import Foreign.C.String
import Foreign.C.Types
import Foreign.Marshal.Alloc
import Foreign.Ptr
import GHC.Float
import Unsafe.Coerce

import BioInf.ViennaRNA.Bindings.FFI.Utils





ffiFold :: ByteString -> IO (Double,ByteString)
ffiFold inp = useAsCString inp $ \cinp ->
              useAsCString inp $ \struc -> do
  e <- if BS.null inp then return 0 else fold cinp struc
  s <- packCString struc
  return (cf2d e, s)

ffiEnergyOfStructure :: ByteString -> ByteString -> Int -> IO Double
ffiEnergyOfStructure inp struc verb =
  useAsCString inp   $ \i ->
  useAsCString struc $ \s ->
    setCutPoint (-1)
    >>  energy_of_structure i s (fromIntegral verb :: CInt)
    >>= (return . cf2d)

ffiEnergyOfCircStructure :: ByteString -> ByteString -> Int -> IO Double
ffiEnergyOfCircStructure inp struc verb =
  useAsCString inp   $ \i ->
  useAsCString struc $ \s ->
    setCutPoint (-1)
    >>  energy_of_circ_structure i s (fromIntegral verb :: CInt)
    >>= (return . cf2d)

ffiCircFold :: ByteString -> IO (Double,ByteString)
ffiCircFold inp = useAsCString inp $ \cinp ->
                  useAsCString inp $ \struc -> do
  e <- circfold cinp struc
  s <- packCString struc
  return (cf2d e, s)



ffiFoldTemp :: Double -> ByteString -> IO (Double,ByteString)
ffiFoldTemp t inp =
  useAsCString inp $ \cinp ->
  useAsCString inp $ \struc -> do
  e <- fold_temp_p (realToFrac t) cinp struc
  s <- packCString struc
  return (cf2d e, s)

ffiEnergyOfStructureTemp :: Double -> ByteString -> ByteString -> Int -> IO Double
ffiEnergyOfStructureTemp t inp struc verb =
  useAsCString inp   $ \i ->
  useAsCString struc $ \s ->
    setCutPoint (-1)
    >>  eos_temp_p (realToFrac t) i s (fromIntegral verb :: CInt)
    >>= (return . cf2d)


foreign import ccall "ffiwrap_fold_temp" fold_temp_p :: CFloat -> CString -> CString -> IO CFloat

foreign import ccall "ffiwrap_eos_temp" eos_temp_p :: CFloat -> CString -> CString -> CInt -> IO CFloat


foreign import ccall safe "BioInf/ViennaRNA/Bindings/FFI/Fold.chs.h fold"
  fold :: ((C2HSImp.Ptr C2HSImp.CChar) -> ((C2HSImp.Ptr C2HSImp.CChar) -> (IO C2HSImp.CFloat)))

foreign import ccall safe "BioInf/ViennaRNA/Bindings/FFI/Fold.chs.h energy_of_structure"
  energy_of_structure :: ((C2HSImp.Ptr C2HSImp.CChar) -> ((C2HSImp.Ptr C2HSImp.CChar) -> (C2HSImp.CInt -> (IO C2HSImp.CFloat))))

foreign import ccall safe "BioInf/ViennaRNA/Bindings/FFI/Fold.chs.h energy_of_circ_structure"
  energy_of_circ_structure :: ((C2HSImp.Ptr C2HSImp.CChar) -> ((C2HSImp.Ptr C2HSImp.CChar) -> (C2HSImp.CInt -> (IO C2HSImp.CFloat))))

foreign import ccall safe "BioInf/ViennaRNA/Bindings/FFI/Fold.chs.h circfold"
  circfold :: ((C2HSImp.Ptr C2HSImp.CChar) -> ((C2HSImp.Ptr C2HSImp.CChar) -> (IO C2HSImp.CFloat)))