on master help sign in
Add rules module
commit6b6a78ea4163bd6b5f843ca9a671aa29f9c29ad9 authorJasper Van der Jeugt <jaspervdj@gmail.com> dateSat 25 Dec 2010, 19:37 (16 years ago) parentc372fc4
1 file changed+83
src/Hakyll/Core/Rules.hs+83
src/Hakyll/Core/Rules.hsnew file+83
@@ -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
3+--
4+{-# LANGUAGE GeneralizedNewtypeDeriving #-}
5+module Hakyll.Core.Rules
6+ ( RuleSet (..)
7+ , RulesM
8+ , Rules
9+ , runRules
10+ , compile
11+ , create
12+ , route
13+ ) where
14+
15+import Control.Applicative (Applicative, (<$>))
16+import Control.Monad.Writer
17+import Control.Monad.Reader
18+
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
24+
25+-- | A collection of rules for the compilation process
26+--
27+data RuleSet a = RuleSet
28+ { rulesRoute :: Route
29+ , rulesCompilers :: [(Identifier, Compiler a)]
30+ }
31+
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)
36+
37+-- | The monad used to compose rules
38+--
39+newtype RulesM a b = RulesM
40+ { unRulesM :: ReaderT ResourceProvider (Writer (RuleSet a)) b
41+ } deriving (Monad, Functor, Applicative)
42+
43+-- | Simplification of the RulesM type; usually, it will not return any
44+-- result.
45+--
46+type Rules a = RulesM a ()
47+
48+-- | Run a Rules monad, resulting in a 'RuleSet'
49+--
50+runRules :: Rules a -> ResourceProvider -> RuleSet a
51+runRules rules provider = execWriter $ runReaderT (unRulesM rules) provider
52+
53+-- | Add a route
54+--
55+addRoute :: Route -> Rules a
56+addRoute route' = RulesM $ tell $ RuleSet route' mempty
57+
58+-- | Add a number of compilers
59+--
60+addCompilers :: [(Identifier, Compiler a)] -> Rules a
61+addCompilers compilers = RulesM $ tell $ RuleSet mempty compilers
62+
63+-- | Add a compilation rule
64+--
65+-- This instructs all resources matching the given pattern to be compiled using
66+-- the given compiler
67+--
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)
72+
73+-- | Add a compilation rule
74+--
75+-- This sets a compiler for the given identifier
76+--
77+create :: Identifier -> Compiler a -> RulesM a ()
78+create identifier compiler = addCompilers [(identifier, compiler)]
79+
80+-- | Add a route
81+--
82+route :: Pattern -> Route -> RulesM a ()
83+route pattern route' = addRoute $ ifMatch pattern route'