{-# LINE 1 "src/Bindings/Libpafe/Pasori.hsc" #-}
{-# LANGUAGE ForeignFunctionInterface #-}
{-# LINE 2 "src/Bindings/Libpafe/Pasori.hsc" #-}
module Bindings.Libpafe.Pasori (
  pasoriPrepare
 ,pasoriClose
 ,withPasori
) where


{-# LINE 9 "src/Bindings/Libpafe/Pasori.hsc" #-}

{-# LINE 10 "src/Bindings/Libpafe/Pasori.hsc" #-}

import Foreign.Ptr
import Foreign.C.Types
import Bindings.Libpafe.Types
import Control.Monad.Trans.Maybe
import Control.Monad.IO.Class (liftIO)
import Control.Exception.Base (mask_)

pasoriPrepare :: IO (Maybe (Ptr Pasori))
pasoriPrepare = do
  pasori <- pasori_open
  result <- pasori_init pasori
  case result of
    0 -> return $ Just pasori
    otherwise -> pasoriClose pasori >> return Nothing

withPasori :: (Ptr Pasori -> IO a) -- ^ IO action that uses pointer to pasori
              -> IO (Maybe a) -- ^ The result
withPasori act = mask_ $ runMaybeT $ do
  pasori <- MaybeT pasoriPrepare
  result <- liftIO $ act pasori
  liftIO $ pasoriClose pasori
  return result

pasoriClose :: Ptr Pasori -> IO() 
pasoriClose = pasori_close

foreign import ccall pasori_open :: IO (Ptr Pasori)

foreign import ccall pasori_init :: Ptr Pasori -> IO CInt

foreign import ccall pasori_close :: Ptr Pasori -> IO ()