-- Hoogle documentation, generated by Haddock
-- See Hoogle, http://www.haskell.org/hoogle/
-- | Inline C & Objective-C code in Haskell for language interoperability
--
-- This library provides inline C & Objective-C code using GHC's
-- support for quasi-quotation. In particular, it enables the use of
-- foreign libraries without a dedicated bridge or binding. Here is a
-- tiny example:
--
--
-- nslog :: String -> IO ()
-- nslog msg = $(objc ['msg :> ''String] (void [cexp| NSLog(@"Here is a message from Haskell: %@", msg) |]))
--
--
-- For more information, see
-- https://github.com/mchakravarty/language-c-inline/wiki.
--
-- Known bugs:
-- https://github.com/mchakravarty/language-c-inline/issues
--
--
-- - New in 0.7.6: (1) Record marshalling; (2) foreign pointer-class
-- marshalling; (3) custom type marshallers. Generated _objc.m files now
-- always include HsFFI.h (as the tool can generate type names
-- declared in that header). Marshals Bool as BOOL. Marshal
-- Int and Word to NSInteger and NSUInteger,
-- respectively.
-- - New in 0.6.0: Introduction of explicit marshalling hints (for more
-- flexibility and support of GHC 7.8's untyped Template Haskell
-- quotations)
-- - New in 0.5.0: Marshalling of numeric types
-- - New in 0.4.0: Maybe types are marshalled as pointers that may be
-- nil & bug fixes.
-- - New in 0.3.0: Boxed Haskell types without a dedicated type mapping
-- are marshalled using stable pointers.
-- - New in 0.2.0: Support for multiple free variables in one inline
-- expression as well as for inline code returning void.
-- - New in 0.1.0: We are just getting started! This is just a ROUGH
-- AND HIGHLY EXPERIMENTAL PROTOTYPE.
--
@package language-c-inline
@version 0.7.7.0
-- | This module exports the principal API for inline Objective-C.
module Language.C.Inline.ObjC
type CString = Ptr CChar
type CStringLen = (Ptr CChar, Int)
type CWString = Ptr CWchar
type CWStringLen = (Ptr CWchar, Int)
data Errno :: *
data ForeignPtr a :: * -> *
castForeignPtr :: ForeignPtr a -> ForeignPtr b
data Name :: *
-- | Specify imported Objective-C files. Needs to be spliced where an
-- import declaration can appear. (Just put it straight after all the
-- import statements in the module.)
--
-- NB: This inline splice must appear before any other use of inline code
-- in a module.
--
-- FIXME: need to use TH.addDependentFile on each of the imported ObjC
-- files & read headers
objc_import :: [FilePath] -> Q [Dec]
-- | Inline Objective-C top-level definitions for a header file ('.h').
objc_interface :: [Definition] -> Q [Dec]
-- | Inline Objective-C top-level definitions for an implementation file
-- ('.m').
--
-- The top-level Haskell variables given in the first argument will be
-- foreign exported to be accessed from the generated Objective-C code.
-- In C, these Haskell variables will always be represented as functions.
-- (In particular, if the Haskell variable refers to a CAF, it will be a
-- nullary function in C — after all, a thunk may still need to be
-- evaluated.)
objc_implementation :: [Annotated Name] -> [Definition] -> Q [Dec]
-- | Specification of a bridge for a Haskell structure that can be queried
-- and updated from Objective-C.
--
-- The first argument is the name of the Objective-C class that will be a
-- proxy for the Haskell structure. The second argument the name of the
-- Haskell type of the bridged Haskell structure.
--
-- The generated class is immutable. When a property is updated, a new
-- instance is allocated. This closely mirrors the behaviour of the
-- Haskell structure for which the class is a proxy.
--
-- The designated initialiser of the generated class is
-- '[-initWithHsNameHsPtr:(HsStablePtr)particleHsPtr]', where
-- '<HsName>' is the type name of the Haskell structure. This
-- initialiser is generated if it is not explicitly provided. The
-- generated method '[-init]' calls the designated initialiser with
-- nil for the stable pointer.
--
-- WARNING: This is a very experimental feature and it will SURELY change
-- in the future!!!
--
-- FIXME: don't generate the designated initialiser if it is explicitly
-- provided
objc_record :: String -> String -> Name -> [Annotated Name] -> [PropertyAccess] -> [ObjCIfaceDecl] -> [Definition] -> Q [Dec]
-- | Declare a Haskell-Objective-C marshaller pair to be used in all
-- subsequent marshalling code generation.
--
-- On the Objective-C side, the marshallers must use a wrapped foreign
-- pointer to an Objective-C class (just as those of Class hints).
-- The domain and codomain of the two marshallers must be the opposite
-- and both are executing in IO.
objc_marshaller :: Name -> Name -> Q [Dec]
-- | Force type checking of all declaration appearing earlier in this
-- module.
--
-- Template Haskell performs type checking on declaration groups
-- seperated by toplevel splices. In order for a type declaration to be
-- available to an Objective-C inline directive, the type declaration
-- must be in an earlier declaration group than the Objective-C inline
-- directive. A toplevel Objective-C inline directive always is the start
-- of a new declaration group; hence, it can be considered to be
-- implicitly preceded by an objc_typecheck.
objc_typecheck :: Q [Dec]
-- | Inline Objective-C expression.
--
-- The inline expression will be wrapped in a C function whose arguments
-- are marshalled versions of the Haskell variables given in the first
-- argument. The marshalling of the variables and of the result is
-- determined by the marshalling annotations at the variables and the
-- inline expression.
objc :: [Annotated Name] -> Annotated Exp -> Q Exp
-- | Emit the Objective-C file and return the foreign declarations. Needs
-- to be the last use of an 'objc...' function. (Just put it at the end
-- of the Haskell module.)
objc_emit :: Q [Dec]
-- | Annotating entities with hints.
--
-- The alternatives are to provide an explicit marshalling hint with
-- '(:>)', or to leave the marshalling implicitly defined by the
-- name's type.
data Annotated e
(:>) :: e -> hint -> Annotated e
Typed :: Name -> Annotated Name
-- | We provide additional syntax where the hint is to the left of the
-- annotated entity.
(<:) :: Hint hint => hint -> e -> Annotated e
-- | Annotation for irrelevant results
void :: e -> Annotated e
-- | Hint indicating to marshal an Objective-C object as a foreign pointer,
-- where the argument is the Haskell type representing the Objective-C
-- class. The Haskell type name must coincide with the Objective-C class
-- name.
data Class
Class :: t -> Class
-- | Class of entities that can be used as TH types.
class IsType ty
-- | Maps a quoted property to a quoted projection and a quoted update
-- function in addition to the type of the projected value.
data PropertyAccess
-- | Map a property to explicit projection and update functions.
(==>) :: ObjCIfaceDecl -> (TypeQ, ExpQ, ExpQ) -> PropertyAccess
-- | Map a property to a field label. This function assumes that the field
-- name is typed and can be reified.
(-->) :: ObjCIfaceDecl -> Name -> PropertyAccess