@@ -0,0 +1,83 @@
1+-- | This module provides a monadic DSL in which the user can specify the
2+-- different rules used to run the compilers
4+{-# LANGUAGE GeneralizedNewtypeDeriving #-}
5+module Hakyll.Core.Rules
15+import Control.Applicative (Applicative, (<$>))
16+import Control.Monad.Writer
17+import Control.Monad.Reader
19+import Hakyll.Core.ResourceProvider
20+import Hakyll.Core.Identifier
21+import Hakyll.Core.Identifier.Pattern
22+import Hakyll.Core.Compiler
23+import Hakyll.Core.Route
25+-- | A collection of rules for the compilation process
27+data RuleSet a = RuleSet
28+ { rulesRoute :: Route
29+ , rulesCompilers :: [(Identifier, Compiler a)]
32+instance Monoid (RuleSet a) where
33+ mempty = RuleSet mempty mempty
34+ mappend (RuleSet r1 c1) (RuleSet r2 c2) =
35+ RuleSet (mappend r1 r2) (mappend c1 c2)
37+-- | The monad used to compose rules
39+newtype RulesM a b = RulesM
40+ { unRulesM :: ReaderT ResourceProvider (Writer (RuleSet a)) b
41+ } deriving (Monad, Functor, Applicative)
43+-- | Simplification of the RulesM type; usually, it will not return any
46+type Rules a = RulesM a ()
48+-- | Run a Rules monad, resulting in a 'RuleSet'
50+runRules :: Rules a -> ResourceProvider -> RuleSet a
51+runRules rules provider = execWriter $ runReaderT (unRulesM rules) provider
55+addRoute :: Route -> Rules a
56+addRoute route' = RulesM $ tell $ RuleSet route' mempty
58+-- | Add a number of compilers
60+addCompilers :: [(Identifier, Compiler a)] -> Rules a
61+addCompilers compilers = RulesM $ tell $ RuleSet mempty compilers
63+-- | Add a compilation rule
65+-- This instructs all resources matching the given pattern to be compiled using
68+compile :: Pattern -> Compiler a -> Rules a
69+compile pattern compiler = RulesM $ do
70+ identifiers <- matches pattern . resourceList <$> ask
71+ unRulesM $ addCompilers $ zip identifiers (repeat compiler)
73+-- | Add a compilation rule
75+-- This sets a compiler for the given identifier
77+create :: Identifier -> Compiler a -> RulesM a ()
78+create identifier compiler = addCompilers [(identifier, compiler)]
82+route :: Pattern -> Route -> RulesM a ()
83+route pattern route' = addRoute $ ifMatch pattern route'