Move Monoid (ReaderT Target Action a) instance to src/Target.hs.
authorAndrey Mokhov <andrey.mokhov@gmail.com>
Fri, 21 Aug 2015 15:10:44 +0000 (16:10 +0100)
committerAndrey Mokhov <andrey.mokhov@gmail.com>
Fri, 21 Aug 2015 15:10:44 +0000 (16:10 +0100)
src/Target.hs

index 2ce94bc..1717a87 100644 (file)
@@ -1,6 +1,6 @@
-{-# LANGUAGE DeriveGeneric, TypeSynonymInstances #-}
+{-# LANGUAGE DeriveGeneric, FlexibleInstances #-}
 module Target (
-    Target (..), StageTarget (..), StagePackageTarget (..), FullTarget (..),
+    Target (..), StageTarget, StagePackageTarget, FullTarget,
     stageTarget, stagePackageTarget, fullTarget, fullTargetWithWay,
     ) where
 
@@ -10,6 +10,8 @@ import Stage
 import Package
 import Builder
 import GHC.Generics
+import Data.Monoid
+import Control.Monad.Reader
 
 -- Target captures all parameters relevant to the current build target:
 -- * Stage and Package being built,
@@ -28,6 +30,14 @@ data Target = Target
      }
      deriving (Show, Eq, Generic)
 
+-- If values of type 'a' form a Monoid then we can also derive a Monoid instance
+-- for values of type 'ReaderT Target Action a':
+-- * the empty computation returns the identity element of the underlying type
+-- * two computations can be combined by combining their results
+instance Monoid a => Monoid (ReaderT Target Action a) where
+    mempty  = return mempty
+    mappend = liftM2 mappend
+
 -- StageTarget is a partially constructed Target. Only stage is guaranteed to
 -- be assigned.
 type StageTarget = Target