git.iko.soy/typeable/pandoc
on master help sign in
Remove reader from PandocPure.

Make it all state. This will make it easier to set things.

commit5a81c914e700af75a0626ac7c7b2e318fb0aa039 authorJesse Rosenthal <jrosenthal@jhu.edu> dateThu 1 Dec 2016, 18:35 (10 years ago) parent06eb9cf
1 file changed+43−50
src/Text/Pandoc/Class.hs+43−50
src/Text/Pandoc/Class.hs+43−50
@@ -34,7 +34,6 @@ Typeclass for pandoc readers and writers, allowing both IO and pure instances.
3434module Text.Pandoc.Class ( PandocMonad(..)
3535 , CommonState(..)
3636 , PureState(..)
37− , PureEnv(..)
3837 , getPOSIXTime
3938 , getZonedTime
4039 , warn
@@ -86,7 +85,6 @@ import System.FilePath ((</>))
8685import qualified System.FilePath.Glob as IO (glob)
8786import qualified System.Directory as IO (getModificationTime)
8887import Control.Monad.State hiding (fail)
89−import Control.Monad.Reader hiding (fail)
9088import Control.Monad.Except hiding (fail)
9189import Data.Word (Word8)
9290import Data.Default
@@ -250,12 +248,30 @@ data PureState = PureState { stStdGen :: StdGen
250248 -- contain every
251249 -- element at most
252250 -- once, e.g. [1..]
251+ , envEnv :: [(String, String)]
252+ , envTime :: UTCTime
253+ , envTimeZone :: TimeZone
254+ , envReferenceDocx :: Archive
255+ , envReferenceODT :: Archive
256+ , envFiles :: FileTree
257+ , envUserDataDir :: FileTree
258+ , envCabalDataDir :: FileTree
259+ , envFontFiles :: [FilePath]
253260 }
254261
255262instance Default PureState where
256263 def = PureState { stStdGen = mkStdGen 1848
257264 , stWord8Store = [1..]
258265 , stUniqStore = [1..]
266+ , envEnv = [("USER", "pandoc-user")]
267+ , envTime = posixSecondsToUTCTime 0
268+ , envTimeZone = utc
269+ , envReferenceDocx = emptyArchive
270+ , envReferenceODT = emptyArchive
271+ , envFiles = mempty
272+ , envUserDataDir = mempty
273+ , envCabalDataDir = mempty
274+ , envFontFiles = []
259275 }
260276data FileInfo = FileInfo { infoFileMTime :: UTCTime
261277 , infoFileContents :: B.ByteString
@@ -267,38 +283,13 @@ newtype FileTree = FileTree {unFileTree :: M.Map FilePath FileInfo}
267283getFileInfo :: FilePath -> FileTree -> Maybe FileInfo
268284getFileInfo fp tree = M.lookup fp $ unFileTree tree
269285
270−data PureEnv = PureEnv { envEnv :: [(String, String)]
271− , envTime :: UTCTime
272− , envTimeZone :: TimeZone
273− , envReferenceDocx :: Archive
274− , envReferenceODT :: Archive
275− , envFiles :: FileTree
276− , envUserDataDir :: FileTree
277− , envCabalDataDir :: FileTree
278− , envFontFiles :: [FilePath]
279− }
280−
281−-- We have to figure this out a bit more. But let's put some empty
282−-- values in for the time being.
283−instance Default PureEnv where
284− def = PureEnv { envEnv = [("USER", "pandoc-user")]
285− , envTime = posixSecondsToUTCTime 0
286− , envTimeZone = utc
287− , envReferenceDocx = emptyArchive
288− , envReferenceODT = emptyArchive
289− , envFiles = mempty
290− , envUserDataDir = mempty
291− , envCabalDataDir = mempty
292− , envFontFiles = []
293− }
294286
295287newtype PandocPure a = PandocPure {
296288 unPandocPure :: ExceptT PandocError
297− (ReaderT PureEnv (StateT CommonState (State PureState))) a
289+ (StateT CommonState (State PureState)) a
298290 } deriving ( Functor
299291 , Applicative
300292 , Monad
301− , MonadReader PureEnv
302293 , MonadState CommonState
303294 , MonadError PandocError
304295 )
@@ -306,38 +297,40 @@ newtype PandocPure a = PandocPure {
306297runPure :: PandocPure a -> Either PandocError a
307298runPure x = flip evalState def $
308299 flip evalStateT def $
309− flip runReaderT def $
310300 runExceptT $
311301 unPandocPure x
312302
303+-- setPureState :: PureState -> PandocPure ()
304+-- setPureState st = PandocPure $ lift $ lift $ lift $ put st
305+
313306instance PandocMonad PandocPure where
314− lookupEnv s = do
315− env <- asks envEnv
307+ lookupEnv s = PandocPure $ do
308+ env <- lift $ lift $ gets envEnv
316309 return (lookup s env)
317310
318− getCurrentTime = asks envTime
311+ getCurrentTime = PandocPure $ lift $ lift $ gets envTime
319312
320− getCurrentTimeZone = asks envTimeZone
313+ getCurrentTimeZone = PandocPure $ lift $ lift $ gets envTimeZone
321314
322− getDefaultReferenceDocx _ = asks envReferenceDocx
315+ getDefaultReferenceDocx _ = PandocPure $ lift $ lift $ gets envReferenceDocx
323316
324− getDefaultReferenceODT _ = asks envReferenceODT
317+ getDefaultReferenceODT _ = PandocPure $ lift $ lift $ gets envReferenceODT
325318
326319 newStdGen = PandocPure $ do
327− g <- lift $ lift $ lift $ gets stStdGen
320+ g <- lift $ lift $ gets stStdGen
328321 let (_, nxtGen) = next g
329− lift $ lift $ lift $ modify $ \st -> st { stStdGen = nxtGen }
322+ lift $ lift $ modify $ \st -> st { stStdGen = nxtGen }
330323 return g
331324
332325 newUniqueHash = PandocPure $ do
333− uniqs <- lift $ lift $ lift $ gets stUniqStore
326+ uniqs <- lift $ lift $ gets stUniqStore
334327 case uniqs of
335328 u : us -> do
336− lift $ lift $ lift $ modify $ \st -> st { stUniqStore = us }
329+ lift $ lift $ modify $ \st -> st { stUniqStore = us }
337330 return u
338331 _ -> M.fail "uniq store ran out of elements"
339− readFileLazy fp = do
340− fps <- asks envFiles
332+ readFileLazy fp = PandocPure $ do
333+ fps <- lift $ lift $ gets envFiles
341334 case infoFileContents <$> getFileInfo fp fps of
342335 Just bs -> return (BL.fromStrict bs)
343336 Nothing -> throwError $ PandocFileReadError fp
@@ -348,14 +341,14 @@ instance PandocMonad PandocPure where
348341 readDataFile Nothing fname = do
349342 let fname' = if fname == "MANUAL.txt" then fname else "data" </> fname
350343 BL.toStrict <$> (readFileLazy fname')
351− readDataFile (Just userDir) fname = do
352− userDirFiles <- asks envUserDataDir
344+ readDataFile (Just userDir) fname = PandocPure $ do
345+ userDirFiles <- lift $ lift $ gets envUserDataDir
353346 case infoFileContents <$> (getFileInfo (userDir </> fname) userDirFiles) of
354347 Just bs -> return bs
355− Nothing -> readDataFile Nothing fname
348+ Nothing -> unPandocPure $ readDataFile Nothing fname
356349 fail = M.fail
357− fetchItem _ fp = do
358− fps <- asks envFiles
350+ fetchItem _ fp = PandocPure $ do
351+ fps <- lift $ lift $ gets envFiles
359352 case infoFileContents <$> (getFileInfo fp fps) of
360353 Just bs -> return (Right (bs, getMimeType fp))
361354 Nothing -> return (Left $ E.toException $ PandocFileReadError fp)
@@ -365,12 +358,12 @@ instance PandocMonad PandocPure where
365358 Nothing -> fetchItem sourceUrl nm
366359 Just (mime, bs) -> return (Right (B.concat $ BL.toChunks bs, Just mime))
367360
368− glob s = do
369− fontFiles <- asks envFontFiles
361+ glob s = PandocPure $ do
362+ fontFiles <- lift $ lift $ gets envFontFiles
370363 return (filter (match (compile s)) fontFiles)
371364
372− getModificationTime fp = do
373− fps <- asks envFiles
365+ getModificationTime fp = PandocPure $ do
366+ fps <- lift $ lift $ gets envFiles
374367 case infoFileMTime <$> (getFileInfo fp fps) of
375368 Just tm -> return tm
376369 Nothing -> throwError $ PandocFileReadError fp