emacs-module-0.1: src/Data/Emacs/Module/Raw/Env/Internal.hs
----------------------------------------------------------------------------
-- |
-- Module : Data.Emacs.Module.Env.Internal
-- Copyright : (c) Sergey Vinokurov 2018
-- License : BSD3-style (see LICENSE)
-- Maintainer : serg.foo@gmail.com
----------------------------------------------------------------------------
{-# LANGUAGE FlexibleContexts #-}
{-# LANGUAGE ForeignFunctionInterface #-}
{-# OPTIONS_HADDOCK not-home #-}
module Data.Emacs.Module.Raw.Env.Internal
( Env(..)
, toPtr
, exportToEmacs
, RawFunctionType
, RawFunction(..)
) where
import Foreign
import Foreign.C.Types
import Data.Emacs.Module.NonNullPtr
import Data.Emacs.Module.Raw.Value
import Data.Emacs.Module.NonNullPtr.Internal
-- | Emacs environment, right from the 'emacs-module.h'.
newtype Env = Env { unEnv :: NonNullPtr Env }
{-# INLINE toPtr #-}
toPtr :: Env -> Ptr Env
toPtr = unNonNullPtr . unEnv
type RawFunctionType a =
Env
-> CPtrdiff -- Number of arguments
-> Ptr RawValue -- Actual arguments
-> Ptr a -- Extra data
-> IO RawValue
-- NB This is *the* coolest point of this library: *any* Haskell
-- function (incl closures) may be exposed to C to be called later.
-- The C/C++ will never have this...
foreign import ccall "wrapper"
exportToEmacs :: RawFunctionType a -> IO (RawFunction a)
newtype RawFunction a = RawFunction { unRawFunction :: FunPtr (RawFunctionType a) }