-- Hoogle documentation, generated by Haddock -- See Hoogle, http://www.haskell.org/hoogle/ -- | Write Haskell source files including C code inline. No FFI required. -- @package inline-c @version 0.5.3.2 -- | A parser for C99 declarations. Currently, the parser has the following -- limitations: -- --
-- $XXX:YYY ---- -- Where XXX is the name of the antiquoter and YYY is -- something parseable by the respective aqParser. data AntiQuoter a AntiQuoter :: (forall m. CParser m => m (String, Type, a)) -> (Purity -> TypesTable -> Type -> a -> Q (Type, Exp)) -> AntiQuoter a -- | Parses the body of the antiquotation, returning a hint for the name to -- assign to the variable that will replace the anti-quotation, the type -- of said variable, and some arbitrary data which will then be fed to -- aqMarshaller. aqParser :: AntiQuoter a -> forall m. CParser m => m (String, Type, a) -- | Takes the requested purity, the current TypesTable, and the -- type and the body returned by aqParser. -- -- Returns the Haskell type for the parameter, and the Haskell expression -- that will be passed in as the parameter. -- -- If the the type returned is ty, the Exp must -- have type forall a. (ty -> IO a) -> IO a. This allows -- to do resource handling when preparing C values. -- -- Care must be taken regarding Purity. Specifically, the -- generated IO computation must be idempotent to guarantee its safety -- when used in pure code. We cannot prevent the IO computation from -- being inlined, hence potentially duplicated. If non-idempotent -- marshallers are required (e.g. if an update to some global state is -- needed), it is best to throw an error when Purity is -- Pure (for example "you cannot use context X with -- pure"), which will show up at compile time. aqMarshaller :: AntiQuoter a -> Purity -> TypesTable -> Type -> a -> Q (Type, Exp) -- | An identifier for a AntiQuoter. type AntiQuoterId = String -- | Existential wrapper around AntiQuoter. data SomeAntiQuoter SomeAntiQuoter :: (AntiQuoter a) -> SomeAntiQuoter type AntiQuoters = Map AntiQuoterId SomeAntiQuoter -- | A Context stores various information needed to produce the -- files with the C code derived from the inline C snippets. -- -- Contexts can be composed with their Monoid instance, -- where mappend is right-biased -- in mappend x y -- y will take precedence over x. data Context Context :: TypesTable -> AntiQuoters -> Maybe String -> Maybe (String -> String) -> Context -- | Needed to convert C types to Haskell types. ctxTypesTable :: Context -> TypesTable -- | Needed to parse and process antiquotations. ctxAntiQuoters :: Context -> AntiQuoters -- | Will determine the extension of the file containing the inline C -- snippets. ctxFileExtension :: Context -> Maybe String -- | This function is used to post-process the functions generated from the -- C snippets. Currently just used to specify C linkage when generating -- C++ code. ctxOutput :: Context -> Maybe (String -> String) -- | Context useful to work with vanilla C. Used by default. -- -- ctxTypesTable: converts C basic types to their counterparts in -- Foreign.C.Types. -- -- No ctxAntiQuoters. baseCtx :: Context -- | This Context includes a AntiQuoter that removes the need -- for explicitely creating FunPtrs, named "fun". -- -- For example, we can capture function f of type CInt -> -- CInt -> IO CInt in C code using $fun:(int (*f)(int, -- int)). -- -- When used in a pure embedding, the Haskell function will have -- to be pure too. Continuing the example above we'll have CInt -> -- CInt -> IO CInt. -- -- Does not include the baseCtx, since most of the time it's going -- to be included as part of larger contexts. funCtx :: Context -- | This Context includes two AntiQuoters that allow to -- easily use Haskell vectors in C. -- -- Specifically, the vec-len and vec-ptr will get the -- length and the pointer underlying mutable (IOVector) and -- immutable (Vector) storable vectors. -- -- Note that if you use vecCtx to manipulate immutable vectors you -- must make sure that the vector is not modified in the C code. -- -- To use vec-len, simply write $vec-len:x, where -- x is something of type IOVector a or -- Vector a, for some a. To use vec-ptr -- you need to specify the type of the pointer, e.g. $vec-len:(int -- *x) will work if x has type IOVector -- CInt. vecCtx :: Context -- | Type class used to implement the anti-quoters in vecCtx. class VecCtx a where type family VecCtxScalar a :: * vecCtxLength :: VecCtx a => a -> Int vecCtxUnsafeWith :: VecCtx a => a -> (Ptr (VecCtxScalar a) -> IO b) -> IO b -- | bsCtx serves exactly the same purpose as vecCtx, but -- only for ByteString. vec-ptr becomes bs-ptr, -- and vec-len becomes bs-len. You don't need to -- specify the type of the pointer in bs-ptr, it will always be -- unsigned char*. bsCtx :: Context instance Eq Purity instance Show Purity instance Storable a => VecCtx (IOVector a) instance Storable a => VecCtx (Vector a) instance Monoid Context module Language.C.Inline.Internal -- | Sets the Context for the current module. This function, if -- called, must be called before any of the other TH functions in this -- module. Fails if that's not the case. setContext :: Context -> Q () -- | Gets the current Context. Also makes sure that the current -- module is initialised. getContext :: Q Context -- | Simply appends some string to the module's C file. Use with care. emitVerbatim :: String -> DecsQ -- | Data type representing a list of C definitions with a typed and named -- entry function. -- -- We use it as a basis to inline and call C code. data Code Code :: Safety -> TypeQ -> String -> String -> Code -- | Safety of the foreign call. codeCallSafety :: Code -> Safety -- | Type of the foreign call. codeType :: Code -> TypeQ -- | Name of the function to call in the code below. codeFunName :: Code -> String -- | The C code. codeDefs :: Code -> String -- | Inlines a piece of code inline. The resulting Exp will have the -- type specified in the codeType. -- -- In practice, this function outputs the C code to the module's C file, -- and then inserts a foreign call of type codeType calling the -- provided codeFunName. -- -- Example: -- --
-- c_add :: Int -> Int -> Int
-- c_add = $(inlineCode $ Code
-- TH.Unsafe -- Call safety
-- [t| Int -> Int -> Int |] -- Call type
-- "francescos_add" -- Call name
-- -- C Code
-- "int francescos_add(int x, int y) { int z = x + y; return z; }")
--
inlineCode :: Code -> ExpQ
-- | Same as inlineCItems, but with a single expression.
--
--
-- c_cos :: Double -> Double
-- c_cos = $(inlineExp
-- TH.Unsafe
-- [t| Double -> Double |]
-- (quickCParser_ "double" parseType)
-- [("x", quickCParser_ "double") parseType]
-- "cos(x)")
--
inlineExp :: Safety -> TypeQ -> Type -> [(Identifier, Type)] -> String -> ExpQ
-- | Same as inlineCode, but accepts a string containing a list of C
-- statements instead instead than a full-blown Code. A function
-- containing the provided statement will be automatically generated.
--
--
-- c_cos :: Double -> Double
-- c_cos = $(inlineItems
-- TH.Unsafe
-- [t| Double -> Double |]
-- (quickCParser_ "double" parseType)
-- [("x", quickCParser_ "double" parseType)]
-- "return cos(x);")
--
inlineItems :: Safety -> TypeQ -> Type -> [(Identifier, Type)] -> String -> ExpQ
data SomeEq
toSomeEq :: (Eq a, Typeable a) => a -> SomeEq
fromSomeEq :: (Eq a, Typeable a) => SomeEq -> Maybe a
data ParameterType
Plain :: String -> ParameterType
AntiQuote :: AntiQuoterId -> SomeEq -> ParameterType
data ParseTypedC
ParseTypedC :: Type -> [(Identifier, Type, ParameterType)] -> String -> ParseTypedC
ptcReturnType :: ParseTypedC -> Type
ptcParameters :: ParseTypedC -> [(Identifier, Type, ParameterType)]
ptcBody :: ParseTypedC -> String
parseTypedC :: CParser m => AntiQuoters -> m ParseTypedC
runParserInQ :: String -> IsTypeName -> (forall m. CParser m => m a) -> Q a
genericQuote :: Purity -> (TypeQ -> Type -> [(Identifier, Type)] -> String -> ExpQ) -> QuasiQuoter
instance Show ParameterType
instance Eq ParameterType
instance Show SomeEq
instance Eq SomeEq
-- | unsafe variants of the Language.C.Inline
-- quasi-quoters, to call the C code unsafely in the sense of
-- https://www.haskell.org/onlinereport/haskell2010/haskellch8.html#x15-1590008.4.3.
-- In GHC, unsafe foreign calls are faster than safe foreign calls, but
-- the user must guarantee the control flow will never enter Haskell code
-- (via a callback or otherwise) before the call is done.
--
-- This module is intended to be imported qualified:
--
-- -- import qualified Language.C.Inline.Unsafe as CU --module Language.C.Inline.Unsafe -- | C expressions. exp :: QuasiQuoter -- | Variant of exp, for use with expressions known to have no side -- effects. -- -- BEWARE: use this function with caution, only when you know what you -- are doing. If an expression does in fact have side-effects, then -- indiscriminate use of pure may endanger referential -- transparency, and in principle even type safety. pure :: QuasiQuoter -- | C code blocks (i.e. statements). block :: QuasiQuoter -- | Enable painless embedding of C code in Haskell code. If you're -- interested in how to use the library, skip to the "Inline C" section. -- To build, read the first two sections. -- -- This module is intended to be imported qualified: -- --
-- import qualified Language.C.Inline as C --module Language.C.Inline -- | A Context stores various information needed to produce the -- files with the C code derived from the inline C snippets. -- -- Contexts can be composed with their Monoid instance, -- where mappend is right-biased -- in mappend x y -- y will take precedence over x. data Context -- | Context useful to work with vanilla C. Used by default. -- -- ctxTypesTable: converts C basic types to their counterparts in -- Foreign.C.Types. -- -- No ctxAntiQuoters. baseCtx :: Context -- | This Context includes a AntiQuoter that removes the need -- for explicitely creating FunPtrs, named "fun". -- -- For example, we can capture function f of type CInt -> -- CInt -> IO CInt in C code using $fun:(int (*f)(int, -- int)). -- -- When used in a pure embedding, the Haskell function will have -- to be pure too. Continuing the example above we'll have CInt -> -- CInt -> IO CInt. -- -- Does not include the baseCtx, since most of the time it's going -- to be included as part of larger contexts. funCtx :: Context -- | This Context includes two AntiQuoters that allow to -- easily use Haskell vectors in C. -- -- Specifically, the vec-len and vec-ptr will get the -- length and the pointer underlying mutable (IOVector) and -- immutable (Vector) storable vectors. -- -- Note that if you use vecCtx to manipulate immutable vectors you -- must make sure that the vector is not modified in the C code. -- -- To use vec-len, simply write $vec-len:x, where -- x is something of type IOVector a or -- Vector a, for some a. To use vec-ptr -- you need to specify the type of the pointer, e.g. $vec-len:(int -- *x) will work if x has type IOVector -- CInt. vecCtx :: Context -- | bsCtx serves exactly the same purpose as vecCtx, but -- only for ByteString. vec-ptr becomes bs-ptr, -- and vec-len becomes bs-len. You don't need to -- specify the type of the pointer in bs-ptr, it will always be -- unsigned char*. bsCtx :: Context -- | Sets the Context for the current module. This function, if -- called, must be called before any of the other TH functions in this -- module. Fails if that's not the case. context :: Context -> DecsQ -- | C expressions. exp :: QuasiQuoter -- | Variant of exp, for use with expressions known to have no side -- effects. -- -- BEWARE: use this function with caution, only when you know what you -- are doing. If an expression does in fact have side-effects, then -- indiscriminate use of pure may endanger referential -- transparency, and in principle even type safety. pure :: QuasiQuoter -- | C code blocks (i.e. statements). block :: QuasiQuoter -- | Emits a CPP include directive for C code associated with the current -- module. To avoid having to escape quotes, the function itself adds -- them when appropriate, so that -- --
-- include "foo.h" ==> #include "foo.h" ---- -- but -- --
-- include "<foo>" ==> #include <foo> --include :: String -> DecsQ -- | Emits an arbitrary C string to the C code associated with the current -- module. Use with care. verbatim :: String -> DecsQ -- | Like alloca, but also peeks the contents of the Ptr and -- returns them once the provided action has finished. withPtr :: Storable a => (Ptr a -> IO b) -> IO (a, b) withPtr_ :: Storable a => (Ptr a -> IO ()) -> IO a -- | Type class with methods useful to allocate and peek multiple pointers -- at once: -- --
-- withPtrs_ :: (Storable a, Storable b) => ((Ptr a, Ptr b) -> IO ()) -> IO (a, b) -- withPtrs_ :: (Storable a, Storable b, Storable c) => ((Ptr a, Ptr b, Ptr c) -> IO ()) -> IO (a, b, c) -- ... --class WithPtrs a where type family WithPtrsPtrs a :: * withPtrs_ f = do { (x, _) <- withPtrs f; return x } withPtrs :: WithPtrs a => (WithPtrsPtrs a -> IO b) -> IO (a, b) withPtrs_ :: WithPtrs a => (WithPtrsPtrs a -> IO ()) -> IO a -- | $(mkFunPtr [t| CDouble -> IO -- CDouble |] generates a foreign import wrapper of type -- --
-- (CDouble -> IO CDouble) -> IO (FunPtr (CDouble -> IO CDouble)) ---- -- And invokes it. mkFunPtr :: TypeQ -> ExpQ -- | $(mkFunPtrFromName 'foo), if foo :: -- CDouble -> IO CDouble, splices in an -- expression of type IO (FunPtr (CDouble -- -> IO CDouble)). mkFunPtrFromName :: Name -> ExpQ -- | $(peekFunPtr [t| CDouble -> IO -- CDouble |]) generates a foreign import dynamic of type -- --
-- FunPtr (CDouble -> IO CDouble) -> (CDouble -> IO CDouble) ---- -- And invokes it. peekFunPtr :: TypeQ -> ExpQ instance (Storable a, Storable b, Storable c, Storable d, Storable e, Storable f, Storable g) => WithPtrs (a, b, c, d, e, f, g) instance (Storable a, Storable b, Storable c, Storable d, Storable e, Storable f) => WithPtrs (a, b, c, d, e, f) instance (Storable a, Storable b, Storable c, Storable d, Storable e) => WithPtrs (a, b, c, d, e) instance (Storable a, Storable b, Storable c, Storable d) => WithPtrs (a, b, c, d) instance (Storable a, Storable b, Storable c) => WithPtrs (a, b, c) instance (Storable a, Storable b) => WithPtrs (a, b)