@@ -40,13 +40,14 @@ module Text.Pandoc.Class ( PandocMonad(..)
4040 , PandocExecutionError(..)
4141 , runIO
4242 , runIOorExplode
43+ , runPure
4344 ) where
4445
4546import Prelude hiding (readFile, fail)
4647import qualified Control.Monad as M (fail)
47−import System.Random (StdGen, next)
48+import System.Random (StdGen, next, mkStdGen)
4849import qualified System.Random as IO (newStdGen)
49−import Codec.Archive.Zip (Archive, fromArchive)
50+import Codec.Archive.Zip (Archive, fromArchive, emptyArchive)
5051import Data.Unique (hashUnique)
5152import qualified Data.Unique as IO (newUnique)
5253import qualified Text.Pandoc.Shared as IO ( fetchItem
@@ -58,7 +59,9 @@ import qualified Text.Pandoc.Shared as IO ( fetchItem
5859import Text.Pandoc.MediaBag (MediaBag, lookupMedia)
5960import Text.Pandoc.Compat.Time (UTCTime)
6061import 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 )
6265import Text.Pandoc.MIME (MimeType, getMimeType)
6366import qualified Data.ByteString as B
6467import qualified Data.ByteString.Lazy as BL
@@ -164,6 +167,13 @@ data TestState = TestState { stStdGen :: StdGen
164167 -- once, e.g. [1..]
165168 }
166169
170+instance Default TestState where
171+ def = TestState { stStdGen = mkStdGen 1848
172+ , stWord8Store = [1..]
173+ , stWarnings = []
174+ , stUniqStore = [1..]
175+ }
176+
167177data TestEnv = TestEnv { envEnv :: [(String, String)]
168178 , envTime :: UTCTime
169179 , envReferenceDocx :: Archive
@@ -174,6 +184,19 @@ data TestEnv = TestEnv { envEnv :: [(String, String)]
174184 , envFontFiles :: [FilePath]
175185 }
176186
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+
177200instance E.Exception PandocExecutionError
178201
179202newtype PandocPure a = PandocPure {
@@ -181,6 +204,9 @@ newtype PandocPure a = PandocPure {
181204 (ReaderT TestEnv (State TestState)) a
182205 } deriving (Functor, Applicative, Monad, MonadReader TestEnv, MonadState TestState, MonadError PandocExecutionError)
183206
207+runPure :: PandocPure a -> Either PandocExecutionError a
208+runPure x = flip evalState def $ flip runReaderT def $ runExceptT $ unPandocPure x
209+
184210instance PandocMonad PandocPure where
185211 lookupEnv s = do
186212 env <- asks envEnv