diff options
author | John MacFarlane <jgm@berkeley.edu> | 2017-08-19 16:39:22 -0700 |
---|---|---|
committer | John MacFarlane <jgm@berkeley.edu> | 2017-08-19 16:39:22 -0700 |
commit | 8b8c94552ffc4d38c7ed0b38af71f9d46026b29b (patch) | |
tree | b6cca9a4d19b0fdd2ab58a0e8b629d4e7d49cdc5 /src/Text | |
parent | a31241a08bcd3d546528ef7eed4c126fff3cd3bd (diff) | |
download | pandoc-8b8c94552ffc4d38c7ed0b38af71f9d46026b29b.tar.gz |
Simplify instances in Class by parameterizing on MonadTrans.
Diffstat (limited to 'src/Text')
-rw-r--r-- | src/Text/Pandoc/Class.hs | 88 |
1 files changed, 21 insertions, 67 deletions
diff --git a/src/Text/Pandoc/Class.hs b/src/Text/Pandoc/Class.hs index 25d6d2927..aebe617b1 100644 --- a/src/Text/Pandoc/Class.hs +++ b/src/Text/Pandoc/Class.hs @@ -4,6 +4,7 @@ {-# LANGUAGE FlexibleInstances #-} {-# LANGUAGE GeneralizedNewtypeDeriving #-} {-# LANGUAGE FlexibleContexts #-} +{-# LANGUAGE UndecidableInstances #-} {- Copyright (C) 2016-17 Jesse Rosenthal <jrosenthal@jhu.edu> @@ -123,11 +124,9 @@ import System.FilePath ((</>), (<.>), takeDirectory, import qualified System.FilePath.Glob as IO (glob) import qualified System.Directory as IO (getModificationTime) import Control.Monad as M (fail) -import Control.Monad.Reader (ReaderT) import Control.Monad.State.Strict import Control.Monad.Except -import Control.Monad.Writer (WriterT) -import Control.Monad.RWS (RWST) +import Control.Monad.Trans (MonadTrans) import Data.Word (Word8) import Data.Default import System.IO.Error @@ -841,53 +840,13 @@ instance PandocMonad PandocPure where logOutput _msg = return () -instance PandocMonad m => PandocMonad (ParsecT s st m) where - lookupEnv = lift . lookupEnv - getCurrentTime = lift getCurrentTime - getCurrentTimeZone = lift getCurrentTimeZone - newStdGen = lift newStdGen - newUniqueHash = lift newUniqueHash - openURL = lift . openURL - readFileLazy = lift . readFileLazy - readFileStrict = lift . readFileStrict - glob = lift . glob - fileExists = lift . fileExists - getDataFileName = lift . getDataFileName - getModificationTime = lift . getModificationTime - getCommonState = lift getCommonState - putCommonState = lift . putCommonState - trace msg = do - tracing <- getsCommonState stTrace - when tracing $ do - pos <- getPosition - Debug.Trace.trace - ("[trace] Parsed " ++ msg ++ " at line " ++ - show (sourceLine pos) ++ - if sourceName pos == "chunk" - then " of chunk" - else "") - (return ()) - logOutput = lift . logOutput - - -instance PandocMonad m => PandocMonad (ReaderT r m) where - lookupEnv = lift . lookupEnv - getCurrentTime = lift getCurrentTime - getCurrentTimeZone = lift getCurrentTimeZone - newStdGen = lift newStdGen - newUniqueHash = lift newUniqueHash - openURL = lift . openURL - readFileLazy = lift . readFileLazy - readFileStrict = lift . readFileStrict - glob = lift . glob - fileExists = lift . fileExists - getDataFileName = lift . getDataFileName - getModificationTime = lift . getModificationTime - getCommonState = lift getCommonState - putCommonState = lift . putCommonState - logOutput = lift . logOutput - -instance (PandocMonad m, Monoid w) => PandocMonad (WriterT w m) where +-- This requires UndecidableInstances. We could avoid that +-- by repeating the definitions below for every monad transformer +-- we use: ReaderT, WriterT, StateT, RWST. But this seems to +-- be harmless. +instance (MonadTrans t, PandocMonad m, Functor (t m), + MonadError PandocError (t m), Monad (t m), + Applicative (t m)) => PandocMonad (t m) where lookupEnv = lift . lookupEnv getCurrentTime = lift getCurrentTime getCurrentTimeZone = lift getCurrentTimeZone @@ -904,7 +863,7 @@ instance (PandocMonad m, Monoid w) => PandocMonad (WriterT w m) where putCommonState = lift . putCommonState logOutput = lift . logOutput -instance (PandocMonad m, Monoid w) => PandocMonad (RWST r w st m) where +instance {-# OVERLAPS #-} PandocMonad m => PandocMonad (ParsecT s st m) where lookupEnv = lift . lookupEnv getCurrentTime = lift getCurrentTime getCurrentTimeZone = lift getCurrentTimeZone @@ -919,21 +878,16 @@ instance (PandocMonad m, Monoid w) => PandocMonad (RWST r w st m) where getModificationTime = lift . getModificationTime getCommonState = lift getCommonState putCommonState = lift . putCommonState + trace msg = do + tracing <- getsCommonState stTrace + when tracing $ do + pos <- getPosition + Debug.Trace.trace + ("[trace] Parsed " ++ msg ++ " at line " ++ + show (sourceLine pos) ++ + if sourceName pos == "chunk" + then " of chunk" + else "") + (return ()) logOutput = lift . logOutput -instance PandocMonad m => PandocMonad (StateT st m) where - lookupEnv = lift . lookupEnv - getCurrentTime = lift getCurrentTime - getCurrentTimeZone = lift getCurrentTimeZone - newStdGen = lift newStdGen - newUniqueHash = lift newUniqueHash - openURL = lift . openURL - readFileLazy = lift . readFileLazy - readFileStrict = lift . readFileStrict - glob = lift . glob - fileExists = lift . fileExists - getDataFileName = lift . getDataFileName - getModificationTime = lift . getModificationTime - getCommonState = lift getCommonState - putCommonState = lift . putCommonState - logOutput = lift . logOutput |