@@ -16,6 +16,7 @@ import Control.Applicative (Applicative, (<$>))
1616import Control.Monad.Reader (ask)
1717import Control.Monad.RWS (RWST, runRWST)
1818import Control.Monad.Trans (liftIO)
19+import Data.Map (Map)
1920import qualified Data.Map as M
2021import Data.Monoid (Monoid, mappend, mempty)
2122import Data.Set (Set)
@@ -97,15 +98,26 @@ runRules rules provider = do
9798 (_, _, ruleSet) <- runRWST (unRules rules) env emptyRulesState
9899
99100 -- Ensure compiler uniqueness
100− let ruleSet' = ruleSet
101− { rulesCompilers = M.toList $
102− M.fromListWith (flip const) (rulesCompilers ruleSet)
103− }
101+ uniqueCompilers <- case fromListUnique (rulesCompilers ruleSet) of
102+ Right m -> return m
103+ Left id' -> error $
104+ "Hakyll.Core.Rules.Internal.runRules: duplicate compiler for " ++
105+ show id'
104106
105− return ruleSet'
107+ return ruleSet {rulesCompilers = M.toList uniqueCompilers}
106108 where
107109 env = RulesRead
108110 { rulesProvider = provider
109111 , rulesMatches = []
110112 , rulesVersion = Nothing
111113 }
114+
115+
116+--------------------------------------------------------------------------------
117+fromListUnique :: Ord k => [(k, v)] -> Either k (Map k v)
118+fromListUnique = go M.empty
119+ where
120+ go m [] = Right m
121+ go m ((k, v) : zs) = case M.lookup k m of
122+ Nothing -> go (M.insert k v m) zs
123+ Just _ -> Left k