git.iko.soy/typeable/pandoc
on master help sign in
API changes to HasReaderOptions, HasHeaderMap, HasIdentifierList.

Previously these were typeclasses of monads. They've been changed to be typeclasses of states. This ismplifies the instance definitions and provides more flexibility. This is an API change! However, it should be backwards compatible unless you're defining instances of HasReaderOptions, HasHeaderMap, or HasIdentifierList. The old getOption function should work as before (albeit with a more general type). The function askReaderOption has been removed. extractReaderOptions has been added. getOption has been given a default definition. In HasHeaderMap, extractHeaderMap and updateHeaderMap have been added. Default definitions have been given for getHeaderMap, putHeaderMap, and modifyHeaderMap. In HasIdentifierList, extractIdentifierList and updateIdentifierList have been added. Default definitions have been given for getIdentifierList, putIdentifierList, and modifyIdentifierList. The ultimate goal here is to allow different parsers to use their own, tailored parser states (instead of ParserState) while still using shared functions.

commit08d1404b31a0fd6edd94b1e5674d3b07d8e4de6a authorJohn MacFarlane <jgm@berkeley.edu> dateTue 25 Mar 2014, 13:43 (13 years ago) parent5e69f84
2 files changed+47−39
src/Text/Pandoc/Parsing.hs+39−31 src/Text/Pandoc/Readers/MediaWiki.hs+8−8
src/Text/Pandoc/Parsing.hs+39−31
@@ -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
src/Text/Pandoc/Readers/MediaWiki.hs+8−8
@@ -82,16 +82,16 @@ data MWState = MWState { mwOptions :: ReaderOptions
8282
8383type MWParser = Parser [Char] MWState
8484
85−instance HasReaderOptions MWParser where
86− askReaderOption f = (f . mwOptions) `fmap` getState
85+instance HasReaderOptions MWState where
86+ extractReaderOptions = mwOptions
8787
88−instance HasHeaderMap MWParser where
89− getHeaderMap = fmap mwHeaderMap getState
90− putHeaderMap hm = updateState $ \st -> st{ mwHeaderMap = hm }
88+instance HasHeaderMap MWState where
89+ extractHeaderMap = mwHeaderMap
90+ updateHeaderMap x st = st{ mwHeaderMap = x }
9191
92−instance HasIdentifierList MWParser where
93− getIdentifierList = fmap mwIdentifierList getState
94− putIdentifierList l = updateState $ \st -> st{ mwIdentifierList = l }
92+instance HasIdentifierList MWState where
93+ extractIdentifierList = mwIdentifierList
94+ updateIdentifierList x st = st{ mwIdentifierList = x }
9595
9696--
9797-- auxiliary functions