Add Resource type for improved type-safety

This commit is contained in:
Jasper Van der Jeugt 2011-02-11 17:52:19 +01:00
parent fc6df44c22
commit 2b9858a8f9
6 changed files with 25 additions and 15 deletions

View file

@ -87,7 +87,7 @@ getRouteFor = fromJob $ \identifier -> CompilerM $ do
-- | Get the resource we are compiling as a string
--
getResourceString :: Compiler a String
getResourceString :: Compiler Resource String
getResourceString = getIdentifier >>> getResourceString'
where
getResourceString' = fromJob $ \id' -> CompilerM $ do
@ -165,8 +165,8 @@ requireAllA pattern = (id &&& requireAll_ pattern >>>)
cached :: (Binary a, Typeable a, Writable a)
=> String
-> Compiler () a
-> Compiler () a
-> Compiler Resource a
-> Compiler Resource a
cached name (Compiler d j) = Compiler d $ const $ CompilerM $ do
identifier <- compilerIdentifier <$> ask
store <- compilerStore <$> ask
@ -174,7 +174,7 @@ cached name (Compiler d j) = Compiler d $ const $ CompilerM $ do
liftIO $ putStrLn $
show identifier ++ ": " ++ if modified then "MODIFIED" else "OK"
if modified
then do v <- unCompilerM $ j ()
then do v <- unCompilerM $ j Resource
liftIO $ storeSet store name identifier v
return v
else do v <- liftIO $ storeGet store name identifier

View file

@ -3,7 +3,8 @@
-- the concrete instance.
--
module Hakyll.Core.ResourceProvider
( ResourceProvider (..)
( Resource (..)
, ResourceProvider (..)
, resourceExists
, resourceDigest
, resourceModified
@ -19,6 +20,10 @@ import OpenSSL.Digest (MessageDigest (MD5))
import Hakyll.Core.Identifier
import Hakyll.Core.Store
-- | A resource
--
data Resource = Resource
-- | A value responsible for retrieving and listing resources
--
data ResourceProvider = ResourceProvider

View file

@ -39,6 +39,7 @@ import Hakyll.Core.Routes
import Hakyll.Core.CompiledItem
import Hakyll.Core.Writable
import Hakyll.Core.Rules.Internal
import Hakyll.Core.Util.Arrow
-- | Add a route
--
@ -62,10 +63,11 @@ tellCompilers compilers = RulesM $ tell $ RuleSet mempty $
-- happen. In this case, you might want to have a look at 'create'.
--
compile :: (Binary a, Typeable a, Writable a)
=> Pattern -> Compiler () a -> Rules
=> Pattern -> Compiler Resource a -> Rules
compile pattern compiler = RulesM $ do
identifiers <- matches pattern . resourceList <$> ask
unRulesM $ tellCompilers $ zip identifiers (repeat compiler)
unRulesM $ tellCompilers $ zip identifiers $ repeat $
constA Resource >>> compiler
-- | Add a compilation rule
--

View file

@ -19,6 +19,7 @@ import Text.Hamlet (HamletSettings)
import Hakyll.Core.Compiler
import Hakyll.Core.Writable
import Hakyll.Core.Identifier
import Hakyll.Core.ResourceProvider
import Hakyll.Web.Page
import Hakyll.Web.Pandoc
import Hakyll.Web.Template
@ -26,7 +27,7 @@ import Hakyll.Web.RelativizeUrls
import Hakyll.Web.Util.String
import Hakyll.Web.CompressCss
defaultPageRead :: Compiler () (Page String)
defaultPageRead :: Compiler Resource (Page String)
defaultPageRead = cached "Hakyll.Web.defaultPageRead" $
pageRead >>> addDefaultFields >>> arr applySelf >>> pageRenderPandoc
@ -36,17 +37,17 @@ defaultRelativizeUrls = getRoute &&& id >>^ uncurry relativize
relativize Nothing = id
relativize (Just r) = fmap (relativizeUrls $ toSiteRoot r)
defaultTemplateRead :: Compiler () Template
defaultTemplateRead :: Compiler Resource Template
defaultTemplateRead = cached "Hakyll.Web.defaultTemplateRead" $ templateRead
defaultTemplateReadWith :: HamletSettings -> Compiler () Template
defaultTemplateReadWith :: HamletSettings -> Compiler Resource Template
defaultTemplateReadWith settings = cached "Hakyll.Web.defaultTemplateReadWith" $
templateReadWith settings
defaultCopyFile :: Compiler () CopyFile
defaultCopyFile :: Compiler Resource CopyFile
defaultCopyFile = getIdentifier >>^ CopyFile . toFilePath
defaultCompressCss :: Compiler () String
defaultCompressCss :: Compiler Resource String
defaultCompressCss = getResourceString >>^ compressCss
defaultApplyTemplate :: Identifier -- ^ Template

View file

@ -68,6 +68,7 @@ import Data.Ord (comparing)
import Hakyll.Core.Identifier
import Hakyll.Core.Compiler
import Hakyll.Core.ResourceProvider
import Hakyll.Web.Page.Internal
import Hakyll.Web.Page.Read
import Hakyll.Web.Page.Metadata
@ -90,7 +91,7 @@ toMap (Page m b) = M.insert "body" b m
-- | Read a page (do not render it)
--
pageRead :: Compiler a (Page String)
pageRead :: Compiler Resource (Page String)
pageRead = getResourceString >>^ readPage
-- | Add a number of default metadata fields to a page. These fields include:

View file

@ -58,6 +58,7 @@ import Text.Hamlet (HamletSettings, defaultHamletSettings)
import Hakyll.Core.Compiler
import Hakyll.Core.Identifier
import Hakyll.Core.ResourceProvider
import Hakyll.Web.Template.Internal
import Hakyll.Web.Template.Read
import Hakyll.Web.Page
@ -85,12 +86,12 @@ applySelf page = applyTemplate (readTemplate $ pageBody page) page
-- @.hml@ or @.hamlet@, it will be considered as a Hamlet template, and parsed
-- as such.
--
templateRead :: Compiler a Template
templateRead :: Compiler Resource Template
templateRead = templateReadWith defaultHamletSettings
-- | Version of 'templateRead' that enables custom settings.
--
templateReadWith :: HamletSettings -> Compiler a Template
templateReadWith :: HamletSettings -> Compiler Resource Template
templateReadWith settings =
getIdentifier &&& getResourceString >>^ uncurry read'
where