-- Hoogle documentation, generated by Haddock -- See Hoogle, http://www.haskell.org/hoogle/ -- | Avoiding the C preprocessor via cunning use of Template Haskell -- -- notcpp is a library that attempts to provide an alternative to using -- CPP as a mechanism for conditional compilation. It provides facilities -- for determining if specific names or class instances exist and -- responding accordingly. -- -- When a value or class instance appears between minor releases of a -- third-party package, a common way of dealing with the problem is to -- use CPP to conditionally use one block of code or another. The trouble -- with CPP is it's hard to statically analyse: tools based on -- haskell-src-exts will outright refuse to parse it, for example. It -- turns out Template Haskell will do the same job in some cases. @package notcpp @version 0.0.1 -- | The orphan instance problem is well-known in Haskell. This module by -- no means purports to solve the problem, but provides a workaround that -- may be significantly less awful than the status quo in some cases. -- -- Say I think that the Name type should have an IsString -- instance. But I don't control either the class or the type, so if I -- define the instance, and then the template-haskell package defines -- one, my code is going to break. -- -- safeInstance can help me to solve this problem: -- --
--   safeInstance ''IsString [t| Name |] [d|
--     fromString = mkName |]
--   
-- -- This will declare an instance only if one doesn't already exist. Now -- anyone importing your module is guaranteed to get an instance one way -- or the other. -- -- This module is still highly experimental. I suspect that some things -- like recursion still won't work, because of how the names are mangled. -- Let me know how you get on! module NotCPP.OrphanEvasion -- | An empty type used only to signify a multiparameter typeclass in -- safeInstance. data MultiParams a -- | safeInstance is a more convenient version of -- safeInstance' that takes the context and type from a -- Q Type with the intention that it be supplied -- using a type-quote. -- -- To define an instance Show a => Show (Wrapper a), you'd -- use: -- --
--   safeInstance ''Show [t| Show a => Wrapper a |]
--     [d| show _ = "stuff" |]
--   
-- -- To define an instance of a multi-param type class, use the -- MultiParams type constructor with a tuple: -- --
--   safeInstance ''MonadState
--     [t| MonadState s m => MultiParams (s, MaybeT m) |]
--     [d| put = ... |]
--   
safeInstance :: Name -> Q Type -> Q [Dec] -> Q [Dec] -- | safeInstance' className cxt types methods produces an -- instance of the given class if and only if one doesn't already exist. -- -- See safeInstance for a simple way to construct the Cxt -- and [Type] parameters. safeInstance' :: Name -> Cxt -> [Type] -> Q [Dec] -> Q [Dec] -- | This module exports scopeLookup, which will find a variable or -- value constructor for you and present it for your use. E.g. at some -- point in the history of the acid-state package, openAcidState -- was renamed openLocalState; for compatibility with both, you -- could use: -- --
--   openState :: IO (AcidState st)
--   openState = case $(scopeLookup "openLocalState") of
--     Just open -> open defaultState
--     Nothing -> case $(scopeLookup "openAcidState") of
--       Just open -> open defaultState
--       Nothing -> error
--         "openState: runtime name resolution has its drawbacks :/"
--   
module NotCPP.ScopeLookup -- | Produces a spliceable expression which expands to 'Just val' if the -- given string refers to a value val in scope, or -- Nothing otherwise. scopeLookup :: String -> Q Exp -- | A useful variant of reify that returns Nothing instead -- of halting compilation when an error occurs (e.g. because the given -- name was not in scope). maybeReify :: Name -> Q (Maybe Info)