packages feed

cudd-0.1.0.0: Cudd/MTR.chs

{-# LANGUAGE ForeignFunctionInterface, EmptyDataDecls, CPP #-}

module Cudd.MTR (
    MtrNode(..),
    CMtrNode,
    mtrAllocNode,
    mtrCreateFirstChild,
    mtrCreateLastChild,
    mtrDeallocNode,
    mtrMakeFirstChild,
    mtrMakeLastChild,
    mtrMakeNextSibling,
    mtrPrintGroups,
    mtrPrintTree,
    mtrMakeGroup,
    mtrInitGroupTree,
    mtrFindGroup,
    mtrDissolveGroup,
    MTRType(..)
    ) where

import System.IO
import Foreign
import Foreign.Ptr
import Foreign.C.Types
import Control.Monad
import Control.Monad.ST
import Control.Monad.ST.Unsafe

#include <stdio.h>
#include <mtr.h>

data CMtrNode 
newtype MtrNode s = MtrNode (Ptr CMtrNode)

foreign import ccall unsafe "Mtr_AllocNode"
    c_mtrAllocNode :: IO (Ptr CMtrNode)

mtrAllocNode :: ST s (MtrNode s) 
mtrAllocNode = liftM MtrNode $ unsafeIOToST c_mtrAllocNode

foreign import ccall unsafe "Mtr_CreateFirstChild"
    c_mtrCreateFirstChild :: Ptr CMtrNode -> IO (Ptr CMtrNode)

mtrCreateFirstChild :: MtrNode s -> ST s (MtrNode s)
mtrCreateFirstChild (MtrNode p) = liftM MtrNode $ unsafeIOToST $ c_mtrCreateFirstChild p

foreign import ccall unsafe "Mtr_CreateLastChild"
    c_mtrCreateLastChild :: Ptr CMtrNode -> IO (Ptr CMtrNode)

mtrCreateLastChild :: MtrNode s -> ST s (MtrNode s)
mtrCreateLastChild (MtrNode p) = liftM MtrNode $ unsafeIOToST $ c_mtrCreateLastChild p

foreign import ccall unsafe "Mtr_DeallocNode"
    c_mtrDeallocNode :: Ptr CMtrNode -> IO ()

mtrDeallocNode :: MtrNode s -> ST s ()
mtrDeallocNode (MtrNode p) = unsafeIOToST $ c_mtrDeallocNode p

foreign import ccall unsafe "Mtr_MakeFirstChild"
    c_mtrMakeFirstChild :: Ptr CMtrNode -> Ptr CMtrNode -> IO ()

mtrMakeFirstChild :: MtrNode s -> MtrNode s -> ST s ()
mtrMakeFirstChild (MtrNode p) (MtrNode c) = unsafeIOToST $ c_mtrMakeFirstChild p c

foreign import ccall unsafe "Mtr_MakeLastChild"
    c_mtrMakeLastChild :: Ptr CMtrNode -> Ptr CMtrNode -> IO ()

mtrMakeLastChild :: MtrNode s -> MtrNode s -> ST s ()
mtrMakeLastChild (MtrNode p) (MtrNode c) = unsafeIOToST $ c_mtrMakeLastChild p c

foreign import ccall unsafe "Mtr_MakeNextSibling"
    c_mtrMakeNextSibling :: Ptr CMtrNode -> Ptr CMtrNode -> IO ()

mtrMakeNextSibling :: MtrNode s -> MtrNode s -> ST s ()
mtrMakeNextSibling (MtrNode f) (MtrNode s) = unsafeIOToST $ c_mtrMakeNextSibling f s

foreign import ccall unsafe "Mtr_PrintGroups"
    c_mtrPrintGroups :: Ptr CMtrNode -> CInt -> IO ()

mtrPrintGroups :: MtrNode s -> Int -> ST s ()
mtrPrintGroups (MtrNode c) s = unsafeIOToST $ c_mtrPrintGroups c (fromIntegral s)

foreign import ccall unsafe "Mtr_PrintTree"
    c_mtrPrintTree :: Ptr CMtrNode -> IO ()

mtrPrintTree :: MtrNode s -> ST s ()
mtrPrintTree (MtrNode c) = unsafeIOToST $ c_mtrPrintTree c

foreign import ccall unsafe "Mtr_MakeGroup"
    c_mtrMakeGroup :: Ptr CMtrNode -> CInt -> CInt -> CInt -> IO (Ptr CMtrNode)

mtrMakeGroup :: MtrNode s -> Int -> Int -> Int -> ST s (MtrNode s)
mtrMakeGroup (MtrNode r) l s f = liftM MtrNode $ unsafeIOToST $ c_mtrMakeGroup r (fromIntegral l) (fromIntegral s) (fromIntegral f)

foreign import ccall unsafe "Mtr_InitGroupTree"
    c_mtrInitGroupTree :: CInt -> CInt -> IO (Ptr CMtrNode)

mtrInitGroupTree :: Int -> Int -> ST s (MtrNode s)
mtrInitGroupTree l s = liftM MtrNode $ unsafeIOToST $ c_mtrInitGroupTree (fromIntegral l) (fromIntegral s)

foreign import ccall unsafe "Mtr_FindGroup"
    c_mtrFindGroup :: Ptr CMtrNode -> CUInt -> CUInt -> IO (Ptr CMtrNode)

mtrFindGroup :: MtrNode s -> Int -> Int -> ST s (MtrNode s)
mtrFindGroup (MtrNode m) x y = liftM MtrNode $ unsafeIOToST $ c_mtrFindGroup m (fromIntegral x) (fromIntegral y)

foreign import ccall unsafe "Mtr_DissolveGroup"
    c_mtrDissolveGroup :: Ptr CMtrNode -> IO ()

mtrDissolveGroup :: MtrNode s -> ST s ()
mtrDissolveGroup (MtrNode m) = unsafeIOToST $ c_mtrDissolveGroup m

#c
enum MTR_TYPES {
    MTRDefault = MTR_DEFAULT,
    MTRTerminal = MTR_TERMINAL,
    MTRSoft = MTR_SOFT,
    MTRFixed = MTR_FIXED,
    MTRNewNode = MTR_NEWNODE
};
#endc

{#enum MTR_TYPES as MTRType {underscoreToCase} deriving (Show, Eq) #}