packages feed

lhc-0.6.20081127: src/C/FFI.hs

module C.FFI(
    CallConv(..),
    Safety(..),
    FfiType(..),
    FfiExport(..),
    FfiSpec(..),
    Requires(..)
    ) where
import Data.Typeable
import Data.DeriveTH
import Data.Derive.All
import Data.Binary
import Data.Monoid
import Control.Monad

type CName    = String

data CallConv = CCall | StdCall | Primitive | DotNet deriving(Eq,Ord,Show)
$(derive makeBinary ''CallConv)

data Safety = Safe | Unsafe deriving(Eq,Ord,Show)
$(derive makeBinary ''Safety)


data Requires = Requires {
    reqIncludes :: [String],
    reqLibraries :: [String]
    } deriving(Eq, Ord)

instance Show Requires where
    show (Requires [] []) = "()"
    show (Requires xs ys) = show (xs,ys)

-- we have to put these after so the instances go in order
$(derive makeBinary ''Requires)
$(derive makeMonoid ''Requires)

data FfiType = Import CName Requires
             | ImportAddr CName Requires
             | Wrapper
             | Dynamic
             deriving(Eq,Ord,Show)
$(derive makeBinary ''FfiType)


data FfiSpec = FfiSpec FfiType Safety CallConv
             deriving(Eq,Ord,Show)
$(derive makeBinary ''FfiSpec)

data FfiExport = FfiExport CName Safety CallConv
             deriving(Eq,Ord,Show,Typeable)
$(derive makeBinary ''FfiExport)