git.iko.soy/typeable/pandoc
on master help sign in
Add runPure function.
b19f79fJesse Rosenthal
src/Text/Pandoc/Class.hs+29−3
@@ -40,13 +40,14 @@ module Text.Pandoc.Class ( PandocMonad(..)
40 , PandocExecutionError(..)
40 , PandocExecutionError(..)
41 , runIO
41 , runIO
42 , runIOorExplode
42 , runIOorExplode
43+ , runPure
43 ) where
44 ) where
44
45
45import Prelude hiding (readFile, fail)
46import Prelude hiding (readFile, fail)
46import qualified Control.Monad as M (fail)
47import qualified Control.Monad as M (fail)
47−import System.Random (StdGen, next)
48+import System.Random (StdGen, next, mkStdGen)
48import qualified System.Random as IO (newStdGen)
49import qualified System.Random as IO (newStdGen)
49−import Codec.Archive.Zip (Archive, fromArchive)
50+import Codec.Archive.Zip (Archive, fromArchive, emptyArchive)
50import Data.Unique (hashUnique)
51import Data.Unique (hashUnique)
51import qualified Data.Unique as IO (newUnique)
52import qualified Data.Unique as IO (newUnique)
52import qualified Text.Pandoc.Shared as IO ( fetchItem
53import qualified Text.Pandoc.Shared as IO ( fetchItem
@@ -58,7 +59,9 @@ import qualified Text.Pandoc.Shared as IO ( fetchItem
58import Text.Pandoc.MediaBag (MediaBag, lookupMedia)
59import Text.Pandoc.MediaBag (MediaBag, lookupMedia)
59import Text.Pandoc.Compat.Time (UTCTime)
60import Text.Pandoc.Compat.Time (UTCTime)
60import qualified Text.Pandoc.Compat.Time as IO (getCurrentTime)
61import qualified Text.Pandoc.Compat.Time as IO (getCurrentTime)
61−import Data.Time.Clock.POSIX ( utcTimeToPOSIXSeconds, POSIXTime )
62+import Data.Time.Clock.POSIX ( utcTimeToPOSIXSeconds
63+ , posixSecondsToUTCTime
64+ , POSIXTime )
62import Text.Pandoc.MIME (MimeType, getMimeType)
65import Text.Pandoc.MIME (MimeType, getMimeType)
63import qualified Data.ByteString as B
66import qualified Data.ByteString as B
64import qualified Data.ByteString.Lazy as BL
67import qualified Data.ByteString.Lazy as BL
@@ -164,6 +167,13 @@ data TestState = TestState { stStdGen :: StdGen
164 -- once, e.g. [1..]
167 -- once, e.g. [1..]
165 }
168 }
166
169
170+instance Default TestState where
171+ def = TestState { stStdGen = mkStdGen 1848
172+ , stWord8Store = [1..]
173+ , stWarnings = []
174+ , stUniqStore = [1..]
175+ }
176+
167data TestEnv = TestEnv { envEnv :: [(String, String)]
177data TestEnv = TestEnv { envEnv :: [(String, String)]
168 , envTime :: UTCTime
178 , envTime :: UTCTime
169 , envReferenceDocx :: Archive
179 , envReferenceDocx :: Archive
@@ -174,6 +184,19 @@ data TestEnv = TestEnv { envEnv :: [(String, String)]
174 , envFontFiles :: [FilePath]
184 , envFontFiles :: [FilePath]
175 }
185 }
176
186
187+-- We have to figure this out a bit more. But let's put some empty
188+-- values in for the time being.
189+instance Default TestEnv where
190+ def = TestEnv { envEnv = [("USER", "pandoc-user")]
191+ , envTime = posixSecondsToUTCTime 0
192+ , envReferenceDocx = emptyArchive
193+ , envReferenceODT = emptyArchive
194+ , envFiles = []
195+ , envUserDataDir = []
196+ , envCabalDataDir = []
197+ , envFontFiles = []
198+ }
199+
177instance E.Exception PandocExecutionError
200instance E.Exception PandocExecutionError
178
201
179newtype PandocPure a = PandocPure {
202newtype PandocPure a = PandocPure {
@@ -181,6 +204,9 @@ newtype PandocPure a = PandocPure {
181 (ReaderT TestEnv (State TestState)) a
204 (ReaderT TestEnv (State TestState)) a
182 } deriving (Functor, Applicative, Monad, MonadReader TestEnv, MonadState TestState, MonadError PandocExecutionError)
205 } deriving (Functor, Applicative, Monad, MonadReader TestEnv, MonadState TestState, MonadError PandocExecutionError)
183
206
207+runPure :: PandocPure a -> Either PandocExecutionError a
208+runPure x = flip evalState def $ flip runReaderT def $ runExceptT $ unPandocPure x
209+
184instance PandocMonad PandocPure where
210instance PandocMonad PandocPure where
185 lookupEnv s = do
211 lookupEnv s = do
186 env <- asks envEnv
212 env <- asks envEnv