on master help sign in
Add MonadMetadata and instances
commit82d5210f25d560e9488ab14f243a2cad9ad906a9 authorJasper Van der Jeugt <m@jaspervdj.be> dateThu 22 Nov 2012, 13:38 (14 years ago) parentaa1762f
7 files changed+68−20
src/Hakyll/Core/Compiler.hs−12 src/Hakyll/Core/Compiler/Internal.hs+29−4 src/Hakyll/Core/Compiler/Require.hs+2−3 src/Hakyll/Core/Metadata.hs+20 src/Hakyll/Core/Rules.hs+1 src/Hakyll/Core/Rules/Internal.hs+15−1 src/Hakyll/Web/Template/Context.hs+1
src/Hakyll/Core/Compiler.hs−12
@@ -6,7 +6,6 @@ module Hakyll.Core.Compiler
66 , getUnderlying
77 , makeItem
88 , getRoute
9− , getMetadata
109 , getResourceBody
1110 , getResourceString
1211 , getResourceLBS
@@ -32,11 +31,9 @@ import System.Environment (getProgName)
3231--------------------------------------------------------------------------------
3332import Hakyll.Core.Compiler.Internal
3433import Hakyll.Core.Compiler.Require
35−import Hakyll.Core.Dependencies
3634import Hakyll.Core.Identifier
3735import Hakyll.Core.Item
3836import Hakyll.Core.Logger as Logger
39−import Hakyll.Core.Metadata
4037import Hakyll.Core.Provider
4138import Hakyll.Core.Routes
4239import qualified Hakyll.Core.Store as Store
@@ -63,15 +60,6 @@ getRoute identifier = do
6360 return $ runRoutes routes identifier
6461
6562
66−
67−--------------------------------------------------------------------------------
68−getMetadata :: Identifier -> Compiler Metadata
69−getMetadata identifier = do
70− provider <- compilerProvider <$> compilerAsk
71− compilerTellDependencies [IdentifierDependency identifier]
72− compilerUnsafeIO $ resourceMetadata provider identifier
73−
74−
7563--------------------------------------------------------------------------------
7664-- | Get the body of the underlying resource
7765getResourceBody :: Compiler (Item String)
src/Hakyll/Core/Compiler/Internal.hs+29−4
@@ -25,16 +25,18 @@ module Hakyll.Core.Compiler.Internal
2525
2626
2727--------------------------------------------------------------------------------
28−import Control.Applicative (Alternative (..),
29− Applicative (..))
30−import Control.Exception (SomeException, handle)
31−import Data.Monoid (Monoid (..))
28+import Control.Applicative (Alternative (..),
29+ Applicative (..), (<$>))
30+import Control.Exception (SomeException, handle)
31+import Data.Monoid (Monoid (..))
3232
3333
3434--------------------------------------------------------------------------------
3535import Hakyll.Core.Dependencies
3636import Hakyll.Core.Identifier
37+import Hakyll.Core.Identifier.Pattern
3738import Hakyll.Core.Logger
39+import Hakyll.Core.Metadata
3840import Hakyll.Core.Provider
3941import Hakyll.Core.Routes
4042import Hakyll.Core.Store
@@ -127,6 +129,12 @@ instance Applicative Compiler where
127129 {-# INLINE (<*>) #-}
128130
129131
132+--------------------------------------------------------------------------------
133+instance MonadMetadata Compiler where
134+ getMetadata = compilerGetMetadata
135+ getMatches = compilerGetMatches
136+
137+
130138--------------------------------------------------------------------------------
131139runCompiler :: Compiler a -> CompilerRead -> IO (CompilerResult a)
132140runCompiler compiler read' = handle handler $ unCompiler compiler read'
@@ -195,3 +203,20 @@ compilerTellDependencies ds = compilerTell mempty {compilerDependencies = ds}
195203compilerTellCacheHits :: Int -> Compiler ()
196204compilerTellCacheHits ch = compilerTell mempty {compilerCacheHits = ch}
197205{-# INLINE compilerTellCacheHits #-}
206+
207+
208+--------------------------------------------------------------------------------
209+compilerGetMetadata :: Identifier -> Compiler Metadata
210+compilerGetMetadata identifier = do
211+ provider <- compilerProvider <$> compilerAsk
212+ compilerTellDependencies [IdentifierDependency identifier]
213+ compilerUnsafeIO $ resourceMetadata provider identifier
214+
215+
216+--------------------------------------------------------------------------------
217+compilerGetMatches :: Pattern -> Compiler [Identifier]
218+compilerGetMatches pattern = do
219+ universe <- compilerUniverse <$> compilerAsk
220+ let matching = filterMatches pattern universe
221+ compilerTellDependencies [PatternDependency pattern matching]
222+ return matching
src/Hakyll/Core/Compiler/Require.hs+2−3
@@ -19,6 +19,7 @@ import Hakyll.Core.Dependencies
1919import Hakyll.Core.Identifier
2020import Hakyll.Core.Identifier.Pattern
2121import Hakyll.Core.Item
22+import Hakyll.Core.Metadata
2223import Hakyll.Core.Store (Store)
2324import qualified Hakyll.Core.Store as Store
2425
@@ -59,9 +60,7 @@ requireBody = fmap itemBody . require
5960--------------------------------------------------------------------------------
6061requireAll :: (Binary a, Typeable a) => Pattern -> Compiler [Item a]
6162requireAll pattern = do
62− universe <- compilerUniverse <$> compilerAsk
63− let matching = filterMatches pattern universe
64− compilerTellDependencies [PatternDependency pattern matching]
63+ matching <- getMatches pattern
6564 mapM require matching
6665
6766
src/Hakyll/Core/Metadata.hs+20
@@ -1,12 +1,32 @@
11--------------------------------------------------------------------------------
22module Hakyll.Core.Metadata
33 ( Metadata
4+ , MonadMetadata (..)
45 ) where
56
67
78--------------------------------------------------------------------------------
9+import Control.Monad (forM)
810import Data.Map (Map)
911
1012
13+--------------------------------------------------------------------------------
14+import Hakyll.Core.Identifier
15+import Hakyll.Core.Identifier.Pattern
16+
17+
1118--------------------------------------------------------------------------------
1219type Metadata = Map String String
20+
21+
22+--------------------------------------------------------------------------------
23+class Monad m => MonadMetadata m where
24+ getMetadata :: Identifier -> m Metadata
25+ getMatches :: Pattern -> m [Identifier]
26+
27+ getAllMetadata :: Pattern -> m [(Identifier, Metadata)]
28+ getAllMetadata pattern = do
29+ matches' <- getMatches pattern
30+ forM matches' $ \id' -> do
31+ metadata <- getMetadata id'
32+ return (id', metadata)
src/Hakyll/Core/Rules.hs+1
@@ -174,6 +174,7 @@ route route' = Rules $ do
174174--------------------------------------------------------------------------------
175175-- | Get a list of resources matching the current pattern. This will also set
176176-- the correct group to the identifiers.
177+-- TODO: Make this private?
177178resources :: Rules [Identifier]
178179resources = Rules $ do
179180 pattern <- rulesPattern <$> ask
src/Hakyll/Core/Rules/Internal.hs+15−1
@@ -12,8 +12,10 @@ module Hakyll.Core.Rules.Internal
1212
1313
1414--------------------------------------------------------------------------------
15−import Control.Applicative (Applicative)
15+import Control.Applicative (Applicative, (<$>))
16+import Control.Monad.Reader (ask)
1617import Control.Monad.RWS (RWST, runRWST)
18+import Control.Monad.Trans (liftIO)
1719import qualified Data.Map as M
1820import Data.Monoid (Monoid, mappend, mempty)
1921import Data.Set (Set)
@@ -24,6 +26,7 @@ import Hakyll.Core.Compiler.Internal
2426import Hakyll.Core.Identifier
2527import Hakyll.Core.Identifier.Pattern
2628import Hakyll.Core.Item.SomeItem
29+import Hakyll.Core.Metadata
2730import Hakyll.Core.Provider
2831import Hakyll.Core.Routes
2932
@@ -70,6 +73,17 @@ newtype Rules a = Rules
7073 } deriving (Monad, Functor, Applicative)
7174
7275
76+--------------------------------------------------------------------------------
77+instance MonadMetadata Rules where
78+ getMetadata identifier = Rules $ do
79+ provider <- rulesProvider <$> ask
80+ liftIO $ resourceMetadata provider identifier
81+
82+ getMatches pattern = Rules $ do
83+ provider <- rulesProvider <$> ask
84+ return $ filterMatches pattern $ resourceList provider
85+
86+
7387--------------------------------------------------------------------------------
7488-- | Run a Rules monad, resulting in a 'RuleSet'
7589runRules :: Rules a -> Provider -> IO RuleSet
src/Hakyll/Web/Template/Context.hs+1
@@ -39,6 +39,7 @@ import Hakyll.Core.Compiler
3939import Hakyll.Core.Compiler.Internal
4040import Hakyll.Core.Identifier
4141import Hakyll.Core.Item
42+import Hakyll.Core.Metadata
4243import Hakyll.Core.Provider
4344import Hakyll.Core.Util.String (splitAll)
4445import Hakyll.Web.Urls