-- 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 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 :: String -> IO (Double,String)
ffiFold inp = withCAString inp $ \cinp ->
              withCAString inp $ \struc -> do
  e <- fold cinp struc
  s <- peekCAString struc
  return (cf2d e, s)

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

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

ffiCircFold :: String -> IO (Double,String)
ffiCircFold inp = withCAString inp $ \cinp ->
                  withCAString inp $ \struc -> do
  e <- circfold cinp struc
  s <- peekCAString struc
  return (cf2d e, s)



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

ffiEnergyOfStructureTemp :: Double -> String -> String -> Int -> IO Double
ffiEnergyOfStructureTemp t inp struc verb =
  withCAString inp   $ \i ->
  withCAString 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)))