@@ -6,7 +6,8 @@
6{-# LANGUAGE MultiParamTypeClasses #-}
6{-# LANGUAGE MultiParamTypeClasses #-}
7module Hakyll.Core.Compiler.Internal
7module Hakyll.Core.Compiler.Internal
8 ( -- * Types
8 ( -- * Types
9− CompilerRead (..)
10+ , CompilerRead (..)
10 , CompilerWrite (..)
11 , CompilerWrite (..)
11 , CompilerResult (..)
12 , CompilerResult (..)
12 , Compiler (..)
13 , Compiler (..)
@@ -50,6 +51,12 @@ import Hakyll.Core.Routes
50import Hakyll.Core.Store
51import Hakyll.Core.Store
54+--------------------------------------------------------------------------------
55+-- | Whilst compiling an item, it possible to save multiple snapshots of it, and
56+-- not just the final result.
57+type Snapshot = String
53--------------------------------------------------------------------------------
60--------------------------------------------------------------------------------
54-- | Environment in which a compiler runs
61-- | Environment in which a compiler runs
55data CompilerRead = CompilerRead
62data CompilerRead = CompilerRead
@@ -86,9 +93,10 @@ instance Monoid CompilerWrite where
87--------------------------------------------------------------------------------
94--------------------------------------------------------------------------------
88data CompilerResult a where
95data CompilerResult a where
89− CompilerDone :: a -> CompilerWrite -> CompilerResult a
96+ CompilerDone :: a -> CompilerWrite -> CompilerResult a
97+ CompilerSnapshot :: Snapshot -> Compiler a -> CompilerResult a
90− CompilerError :: [String] -> CompilerResult a
98+ CompilerError :: [String] -> CompilerResult a
91− CompilerRequire :: Identifier -> Compiler a -> CompilerResult a
99+ CompilerRequire :: (Identifier, Snapshot) -> Compiler a -> CompilerResult a
94--------------------------------------------------------------------------------
102--------------------------------------------------------------------------------
@@ -104,9 +112,10 @@ instance Functor Compiler where
104 fmap f (Compiler c) = Compiler $ \r -> do
112 fmap f (Compiler c) = Compiler $ \r -> do
105 res <- c r
113 res <- c r
106 return $ case res of
114 return $ case res of
107− CompilerDone x w -> CompilerDone (f x) w
115+ CompilerDone x w -> CompilerDone (f x) w
116+ CompilerSnapshot s c' -> CompilerSnapshot s (fmap f c')
108− CompilerError e -> CompilerError e
117+ CompilerError e -> CompilerError e
109− CompilerRequire i c' -> CompilerRequire i (fmap f c')
118+ CompilerRequire i c' -> CompilerRequire i (fmap f c')
110 {-# INLINE fmap #-}
119 {-# INLINE fmap #-}
@@ -121,14 +130,16 @@ instance Monad Compiler where
121 CompilerDone x w -> do
130 CompilerDone x w -> do
122 res' <- unCompiler (f x) r
131 res' <- unCompiler (f x) r
123 return $ case res' of
132 return $ case res' of
124− CompilerDone y w' -> CompilerDone y (w `mappend` w')
133+ CompilerDone y w' -> CompilerDone y (w `mappend` w')
134+ CompilerSnapshot s c' -> CompilerSnapshot s c'
125− CompilerError e -> CompilerError e
135+ CompilerError e -> CompilerError e
126− CompilerRequire i c' -> CompilerRequire i $ do
136+ CompilerRequire i c' -> CompilerRequire i $ do
127 compilerTell w -- Save dependencies!
137 compilerTell w -- Save dependencies!
140+ CompilerSnapshot s c' -> return $ CompilerSnapshot s (c' >>= f)
130− CompilerError e -> return $ CompilerError e
141+ CompilerError e -> return $ CompilerError e
131− CompilerRequire i c' -> return $ CompilerRequire i $ c' >>= f
142+ CompilerRequire i c' -> return $ CompilerRequire i (c' >>= f)
132 {-# INLINE (>>=) #-}
143 {-# INLINE (>>=) #-}
134 fail = compilerThrow . return
145 fail = compilerThrow . return
@@ -198,9 +209,10 @@ compilerCatch :: Compiler a -> ([String] -> Compiler a) -> Compiler a
198compilerCatch (Compiler x) f = Compiler $ \r -> do
209compilerCatch (Compiler x) f = Compiler $ \r -> do
199 res <- x r
210 res <- x r
200 case res of
211 case res of
201− CompilerDone res' w -> return (CompilerDone res' w)
212+ CompilerDone res' w -> return (CompilerDone res' w)
213+ CompilerSnapshot s c -> return (CompilerSnapshot s (compilerCatch c f))
202− CompilerError e -> unCompiler (f e) r
214+ CompilerError e -> unCompiler (f e) r
203− CompilerRequire i c -> return (CompilerRequire i (compilerCatch c f))
215+ CompilerRequire i c -> return (CompilerRequire i (compilerCatch c f))
204{-# INLINE compilerCatch #-}
216{-# INLINE compilerCatch #-}