cudd-0.1.0.0: Cudd/Convert.hs
module Cudd.Convert (
fromImperativeNode,
fromImperativeManager,
toImperativeNode,
toImperativeManager
) where
import System.IO.Unsafe
import Foreign.ForeignPtr
import Foreign.ForeignPtr.Unsafe
import Control.Monad.ST
import Control.Monad.ST.Unsafe
import Cudd.Cudd as C
import Cudd.C
import Cudd.Imperative as I hiding (deref)
fromImperativeNode :: C.DDManager -> I.DDNode s u -> C.DDNode
fromImperativeNode (C.DDManager m) (I.DDNode d) = C.DDNode $ unsafePerformIO $ do
cuddRef d
newForeignPtrEnv deref m d
fromImperativeManager :: I.DDManager s u -> C.DDManager
fromImperativeManager = C.DDManager . I.unDDManager
toImperativeNode :: C.DDNode -> ST s (I.DDNode s u)
toImperativeNode (C.DDNode fp) = unsafeIOToST $ do
let p = unsafeForeignPtrToPtr fp
cuddRef p
return $ I.DDNode p
toImperativeManager :: C.DDManager -> I.DDManager s u
toImperativeManager (C.DDManager m) = I.DDManager m