@@ -64,7 +64,6 @@ module Text.Pandoc.Parsing ( (>>~),
6464 gridTableWith,
6565 readWith,
6666 testStringWith,
67− getOption,
6867 guardEnabled,
6968 guardDisabled,
7069 ParserState (..),
@@ -870,33 +869,45 @@ instance HasMeta ParserState where
870869 deleteMeta field st =
871870 st{ stateMeta = deleteMeta field $ stateMeta st }
872871
873−class Monad m => HasReaderOptions m where
874− askReaderOption :: (ReaderOptions -> b) -> m b
875−
876−class Monad m => HasHeaderMap m where
877− getHeaderMap :: m (M.Map Inlines String)
878− putHeaderMap :: M.Map Inlines String -> m ()
879− modifyHeaderMap :: (M.Map Inlines String -> M.Map Inlines String) -> m ()
872+class HasReaderOptions st where
873+ extractReaderOptions :: st -> ReaderOptions
874+ getOption :: (ReaderOptions -> b) -> Parser s st b
875+ -- default
876+ getOption f = (f . extractReaderOptions) `fmap` getState
877+
878+instance HasReaderOptions ParserState where
879+ extractReaderOptions = stateOptions
880+
881+class HasHeaderMap st where
882+ extractHeaderMap :: st -> M.Map Inlines String
883+ updateHeaderMap :: M.Map Inlines String -> st -> st
884+ getHeaderMap :: Parser s st (M.Map Inlines String)
885+ putHeaderMap :: M.Map Inlines String -> Parser s st ()
886+ modifyHeaderMap :: (M.Map Inlines String -> M.Map Inlines String)
887+ -> Parser s st ()
880888 -- default
889+ getHeaderMap = extractHeaderMap `fmap` getState
890+ putHeaderMap x = updateState (updateHeaderMap x)
881891 modifyHeaderMap f = getHeaderMap >>= putHeaderMap . f
882892
883−class Monad m => HasIdentifierList m where
884− getIdentifierList :: m [String]
885− putIdentifierList :: [String] -> m ()
886− modifyIdentifierList :: ([String] -> [String]) -> m ()
893+instance HasHeaderMap ParserState where
894+ extractHeaderMap = stateHeaders
895+ updateHeaderMap x st = st{ stateHeaders = x }
896+
897+class HasIdentifierList st where
898+ extractIdentifierList :: st -> [String]
899+ updateIdentifierList :: [String] -> st -> st
900+ getIdentifierList :: Parser s st ([String])
901+ putIdentifierList :: [String] -> Parser s st ()
902+ modifyIdentifierList :: ([String] -> [String]) -> Parser s st ()
887903 -- default
904+ getIdentifierList = extractIdentifierList `fmap` getState
905+ putIdentifierList x = updateState (updateIdentifierList x)
888906 modifyIdentifierList f = getIdentifierList >>= putIdentifierList . f
889907
890−instance HasReaderOptions (Parser s ParserState) where
891− askReaderOption = getOption
892−
893−instance HasHeaderMap (Parser s ParserState) where
894− getHeaderMap = fmap stateHeaders getState
895− putHeaderMap hm = updateState $ \st -> st{ stateHeaders = hm }
896−
897−instance HasIdentifierList (Parser s ParserState) where
898− getIdentifierList = fmap stateIdentifiers getState
899− putIdentifierList l = updateState $ \st -> st{ stateIdentifiers = l }
908+instance HasIdentifierList ParserState where
909+ extractIdentifierList = stateIdentifiers
910+ updateIdentifierList x st = st{ stateIdentifiers = x }
900911
901912defaultParserState :: ParserState
902913defaultParserState =
@@ -923,15 +934,12 @@ defaultParserState =
923934 stateRstCustomRoles = M.empty,
924935 stateWarnings = []}
925936
926−getOption :: (ReaderOptions -> a) -> Parser s ParserState a
927−getOption f = (f . stateOptions) `fmap` getState
928−
929937-- | Succeed only if the extension is enabled.
930−guardEnabled :: Extension -> Parser s ParserState ()
938+guardEnabled :: HasReaderOptions st => Extension -> Parser s st ()
931939guardEnabled ext = getOption readerExtensions >>= guard . Set.member ext
932940
933941-- | Succeed only if the extension is disabled.
934−guardDisabled :: Extension -> Parser s ParserState ()
942+guardDisabled :: HasReaderOptions st => Extension -> Parser s st ()
935943guardDisabled ext = getOption readerExtensions >>= guard . not . Set.member ext
936944
937945data HeaderType
@@ -968,11 +976,11 @@ type SubstTable = M.Map Key Inlines
968976-- and the auto_identifers extension is set, generate a new
969977-- unique identifier, and update the list of identifiers
970978-- in state.
971−registerHeader :: (HasReaderOptions m, HasHeaderMap m, HasIdentifierList m)
972− => Attr -> Inlines -> m Attr
979+registerHeader :: (HasReaderOptions st, HasHeaderMap st, HasIdentifierList st)
980+ => Attr -> Inlines -> Parser s st Attr
973981registerHeader (ident,classes,kvs) header' = do
974982 ids <- getIdentifierList
975− exts <- askReaderOption readerExtensions
983+ exts <- getOption readerExtensions
976984 let insert' = M.insertWith (\_new old -> old)
977985 if null ident && Ext_auto_identifiers `Set.member` exts
978986 then do
@@ -990,7 +998,7 @@ registerHeader (ident,classes,kvs) header' = do
990998 return (ident,classes,kvs)
991999
9921000-- | Fail unless we're in "smart typography" mode.
993−failUnlessSmart :: Parser [tok] ParserState ()
1001+failUnlessSmart :: HasReaderOptions st => Parser s st ()
9941002failUnlessSmart = getOption readerSmart >>= guard
9951003
9961004smartPunctuation :: Parser [Char] ParserState Inline