summaryrefslogtreecommitdiff
path: root/src/Hakyll/Core/Target/Internal.hs
blob: a58f73642bc44d2436c1fbddb988c152f0f220dc (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
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'
        }