module MarXup.MultiRef where
import Control.Monad.Fix
import Control.Monad.RWS.Lazy
import Data.Map.Strict (Map,insert)
import qualified Data.Map.Strict as M
import Graphics.Diagrams.Core (BoxSpec, nilBoxSpec)
type MetaData key = Map key String
type BoxSpecs = Map Int BoxSpec
newtype Multi config key a = Multi {fromMulti :: RWS config String (References,BoxSpecs,MetaData key) a }
deriving (Functor, Monad, MonadReader config, Applicative, MonadWriter String, MonadState (References,BoxSpecs,MetaData key), MonadFix)
type Label = Int
raw :: String -> Multi config key ()
raw s = tell s
getBoxSpec :: Int -> Multi config key BoxSpec
getBoxSpec bxId = do
(_,bs,_) <- get
return $ case M.lookup bxId bs of
Nothing -> nilBoxSpec
Just b -> b
newLabel :: Multi key config Label
newLabel = do (r,bx,m) <- get
put (r+1,bx,m)
return r
metaData :: Ord key => key -> String -> Multi config key ()
metaData k val = do
(r,bx,m) <- get
put (r,bx,insert k val m)
return ()
type References = Int
emptyRefs :: References
emptyRefs = 0