diff options
-rw-r--r-- | src/Hakyll/Core/DirectedGraph/Internal.hs | 3 | ||||
-rw-r--r-- | src/Hakyll/Core/Target.hs | 11 | ||||
-rw-r--r-- | src/Hakyll/Core/Target/Internal.hs | 46 |
3 files changed, 59 insertions, 1 deletions
diff --git a/src/Hakyll/Core/DirectedGraph/Internal.hs b/src/Hakyll/Core/DirectedGraph/Internal.hs index 9890fc0..52a712d 100644 --- a/src/Hakyll/Core/DirectedGraph/Internal.hs +++ b/src/Hakyll/Core/DirectedGraph/Internal.hs @@ -1,4 +1,5 @@ --- | Internal structure of the DirectedGraph type. Not exported in the library. +-- | Internal structure of the DirectedGraph type. Not exported outside of the +-- library. -- module Hakyll.Core.DirectedGraph.Internal ( Node (..) diff --git a/src/Hakyll/Core/Target.hs b/src/Hakyll/Core/Target.hs new file mode 100644 index 0000000..1f783df --- /dev/null +++ b/src/Hakyll/Core/Target.hs @@ -0,0 +1,11 @@ +-- | A target represents one compilation unit, e.g. a blog post, a CSS file... +-- +{-# LANGUAGE GeneralizedNewtypeDeriving #-} +module Hakyll.Core.Target + ( DependencyLookup + , TargetM + , Target + , runTarget + ) where + +import Hakyll.Core.Target.Internal diff --git a/src/Hakyll/Core/Target/Internal.hs b/src/Hakyll/Core/Target/Internal.hs new file mode 100644 index 0000000..a58f736 --- /dev/null +++ b/src/Hakyll/Core/Target/Internal.hs @@ -0,0 +1,46 @@ +-- | Internal structure of a Target, not exported outside of the library +-- +{-# LANGUAGE GeneralizedNewtypeDeriving #-} +module Hakyll.Core.Target.Internal + ( DependencyLookup + , TargetM (..) + , Target + , runTarget + ) where + +import Control.Monad.Trans (MonadIO) +import Control.Monad.Reader (ReaderT, runReaderT) + +import Hakyll.Core.Identifier + +-- | A lookup with which we can get dependencies +-- +type DependencyLookup a = Identifier -> a + +-- | Environment for the target monad +-- +data TargetEnvironment a = TargetEnvironment + { targetIdentifier :: Identifier + , targetDependencyLookup :: DependencyLookup a -- ^ Dependency lookup + } + +-- | Monad for targets. In this monad, the user can compose targets and describe +-- how they should be created. +-- +newtype TargetM a b = TargetM {unTargetM :: ReaderT (TargetEnvironment a) IO b} + deriving (Monad, Functor, MonadIO) + +-- | Simplification of the 'TargetM' type for concrete cases: the type of the +-- returned item should equal the type of the dependencies. +-- +type Target a = TargetM a a + +-- | Run a target, yielding an actual result. +-- +runTarget :: Target a -> Identifier -> DependencyLookup a -> IO a +runTarget target id' lookup' = runReaderT (unTargetM target) env + where + env = TargetEnvironment + { targetIdentifier = id' + , targetDependencyLookup = lookup' + } |