@@ -16,6 +16,7 @@ import Control.Applicative (Applicative, (<$>))
16import Control.Monad.Reader (ask)
16import Control.Monad.Reader (ask)
17import Control.Monad.RWS (RWST, runRWST)
17import Control.Monad.RWS (RWST, runRWST)
18import Control.Monad.Trans (liftIO)
18import Control.Monad.Trans (liftIO)
19import qualified Data.Map as M
20import qualified Data.Map as M
20import Data.Monoid (Monoid, mappend, mempty)
21import Data.Monoid (Monoid, mappend, mempty)
21import Data.Set (Set)
22import Data.Set (Set)
@@ -97,15 +98,26 @@ runRules rules provider = do
97 (_, _, ruleSet) <- runRWST (unRules rules) env emptyRulesState
98 (_, _, ruleSet) <- runRWST (unRules rules) env emptyRulesState
99 -- Ensure compiler uniqueness
100 -- Ensure compiler uniqueness
100− let ruleSet' = ruleSet
101+ uniqueCompilers <- case fromListUnique (rulesCompilers ruleSet) of
101− { rulesCompilers = M.toList $
102+ Right m -> return m
102− M.fromListWith (flip const) (rulesCompilers ruleSet)
103+ Left id' -> error $
103− }
104+ "Hakyll.Core.Rules.Internal.runRules: duplicate compiler for " ++
105− return ruleSet'
107+ return ruleSet {rulesCompilers = M.toList uniqueCompilers}
107 env = RulesRead
109 env = RulesRead
108 { rulesProvider = provider
110 { rulesProvider = provider
109 , rulesMatches = []
111 , rulesMatches = []
110 , rulesVersion = Nothing
112 , rulesVersion = Nothing
116+--------------------------------------------------------------------------------
117+fromListUnique :: Ord k => [(k, v)] -> Either k (Map k v)
118+fromListUnique = go M.empty
121+ go m ((k, v) : zs) = case M.lookup k m of
122+ Nothing -> go (M.insert k v m) zs