@@ -16,9 +16,9 @@ import Control.Applicative (Applicative, (<$>))
1616import Control.Monad.Reader (ask)
1717import Control.Monad.RWS (RWST, runRWST)
1818import Control.Monad.Trans (liftIO)
19+import qualified Data.Map as M
1920import Data.Monoid (Monoid, mappend, mempty)
2021import Data.Set (Set)
21−import qualified Data.Set as S
2222
2323
2424--------------------------------------------------------------------------------
@@ -92,25 +92,17 @@ instance MonadMetadata Rules where
9292runRules :: Rules a -> Provider -> IO RuleSet
9393runRules rules provider = do
9494 (_, _, ruleSet) <- runRWST (unRules rules) env emptyRulesState
95− case findDuplicate (map fst $ rulesCompilers ruleSet) of
96− Nothing -> return ruleSet
97− Just id' -> error $
98− "Hakyll.Core.Rules.Internal: two different rules for " ++
99− show id' ++ " exist, bailing out"
10095
96+ -- Ensure compiler uniqueness
97+ let ruleSet' = ruleSet
98+ { rulesCompilers = M.toList $
99+ M.fromListWith (flip const) (rulesCompilers ruleSet)
100+ }
101+
102+ return ruleSet'
101103 where
102104 env = RulesRead
103105 { rulesProvider = provider
104106 , rulesMatches = []
105107 , rulesVersion = Nothing
106108 }
107−
108−
109−--------------------------------------------------------------------------------
110−findDuplicate :: Ord a => [a] -> Maybe a
111−findDuplicate = go S.empty
112− where
113− go _ [] = Nothing
114− go s (x : xs)
115− | x `S.member` s = Just x
116− | otherwise = go (S.insert x s) xs