Commit 8b084408 authored by gmainland's avatar gmainland
Browse files

Add Template Haskell state.

The Quasi monad can now carry state, and this state can be shared amongst
quasiquoters/splices/etc. State is stored in a finite map of Dynamic values and
is indexed by TypeReps.
parent bb89c59f
......@@ -66,6 +66,10 @@ class (Monad m, Applicative m) => Quasi m where
qAddModFinalizer :: Q () -> m ()
qGetQ :: Typeable a => m (Maybe a)
qPutQ :: Typeable a => a -> m ()
-----------------------------------------------------
-- The IO instance of Quasi
--
......@@ -94,6 +98,8 @@ instance Quasi IO where
qAddDependentFile _ = badIO "addDependentFile"
qAddTopDecls _ = badIO "addTopDecls"
qAddModFinalizer _ = badIO "addModFinalizer"
qGetQ = badIO "getQ"
qPutQ _ = badIO "putQ"
qRunIO m = m
......@@ -354,6 +360,14 @@ addTopDecls ds = Q (qAddTopDecls ds)
addModFinalizer :: Q () -> Q ()
addModFinalizer act = Q (qAddModFinalizer (unQ act))
-- | Get state from the Q monad.
getQ :: Typeable a => Q (Maybe a)
getQ = Q qGetQ
-- | Replace the state in the Q monad.
putQ :: Typeable a => a -> Q ()
putQ x = Q (qPutQ x)
instance Quasi Q where
qNewName = newName
qReport = report
......@@ -367,6 +381,8 @@ instance Quasi Q where
qAddDependentFile = addDependentFile
qAddTopDecls = addTopDecls
qAddModFinalizer = addModFinalizer
qGetQ = getQ
qPutQ = putQ
----------------------------------------------------
......
Markdown is supported
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment