On Wed, Sep 09, 2015 at 12:10:31PM +0200, 'Bhimanavajjula Aditya' via 
ganeti-devel wrote:
Ganeti.Prelude exports the exact same interface
as exported by base 4.8.0 Prelude. However, it
also compiles under lesser base versions.

Whenever we need functions that are in Ganeti.Prelude,
but not in Prelude (of lesser base versions), we use
Ganeti.Prelude instead by:

import Prelude ()
import Ganeti.Prelude

Signed-off-by: Bhimanavajjula Aditya <[email protected]>
---
Makefile.am                                     |   1 +
src/Ganeti/BasicTypes.hs                        |   6 +-
src/Ganeti/Codec.hs                             |   4 +-
src/Ganeti/Confd/Server.hs                      |   4 +-
src/Ganeti/Confd/Utils.hs                       |   4 +-
src/Ganeti/Config.hs                            |   7 +-
src/Ganeti/ConstantUtils.hs                     |   4 +-
src/Ganeti/Cpu/LoadParser.hs                    |   5 +-
src/Ganeti/DataCollectors.hs                    |   4 +-
src/Ganeti/DataCollectors/XenCpuLoad.hs         |   5 +-
src/Ganeti/HTools/Cluster.hs                    |  14 +-
src/Ganeti/HTools/Dedicated.hs                  |   5 +-
src/Ganeti/HTools/Node.hs                       |   6 +-
src/Ganeti/JQScheduler.hs                       |  21 ++-
src/Ganeti/JQueue.hs                            |  19 ++-
src/Ganeti/Kvmd.hs                              |   6 +-
src/Ganeti/Lens.hs                              |   5 +-
src/Ganeti/Locking/Allocation.hs                |   7 +-
src/Ganeti/Locking/Locks.hs                     |   4 +-
src/Ganeti/Logging.hs                           |   5 +-
src/Ganeti/Metad/ConfigCore.hs                  |   4 +-
src/Ganeti/Monitoring/Server.hs                 |   6 +-
src/Ganeti/Objects.hs                           |   5 +-
src/Ganeti/Objects/Disk.hs                      |   4 +-
src/Ganeti/Objects/Instance.hs                  |   3 +-
src/Ganeti/OpCodes.hs                           |   4 +-
src/Ganeti/Parsers.hs                           |   4 +-
src/Ganeti/Prelude.hs                           | 218 ++++++++++++++++++++++++
src/Ganeti/Query/Exec.hs                        |   4 +-
src/Ganeti/Query/Filter.hs                      |   5 +-
src/Ganeti/Query/Language.hs                    |   5 +-
src/Ganeti/Query/Node.hs                        |   6 +-
src/Ganeti/Query/Server.hs                      |   4 +-
src/Ganeti/Ssconf.hs                            |   4 +-
src/Ganeti/Storage/Diskstats/Parser.hs          |   4 +-
src/Ganeti/Storage/Drbd/Parser.hs               |   5 +-
src/Ganeti/Storage/Lvm/LVParser.hs              |   4 +-
src/Ganeti/THH.hs                               |   8 +-
src/Ganeti/THH/HsRPC.hs                         |   8 +-
src/Ganeti/THH/PyRPC.hs                         |   6 +-
src/Ganeti/THH/PyType.hs                        |   6 +-
src/Ganeti/THH/RPC.hs                           |   4 +-
src/Ganeti/Types.hs                             |   4 +-
src/Ganeti/UDSServer.hs                         |   6 +-
src/Ganeti/Utils.hs                             |  12 +-
src/Ganeti/Utils/MultiMap.hs                    |   4 +-
src/Ganeti/Utils/Random.hs                      |   4 +-
src/Ganeti/Utils/Validate.hs                    |   4 +-
src/Ganeti/WConfd/ConfigModifications.hs        |   6 +-
src/Ganeti/WConfd/ConfigState.hs                |   4 +-
src/Ganeti/WConfd/ConfigWriter.hs               |   5 +-
src/Ganeti/WConfd/Monad.hs                      |   4 +-
src/Ganeti/WConfd/TempRes.hs                    |   4 +-
test/hs/Test/Ganeti/BasicTypes.hs               |   4 +-
test/hs/Test/Ganeti/Confd/Types.hs              |   4 +-
test/hs/Test/Ganeti/HTools/Instance.hs          |   4 +-
test/hs/Test/Ganeti/HTools/Types.hs             |   4 +-
test/hs/Test/Ganeti/JQScheduler.hs              |   5 +-
test/hs/Test/Ganeti/JQueue/Objects.hs           |   4 +-
test/hs/Test/Ganeti/Locking/Allocation.hs       |   4 +-
test/hs/Test/Ganeti/Locking/Locks.hs            |   5 +-
test/hs/Test/Ganeti/Locking/Waiting.hs          |   5 +-
test/hs/Test/Ganeti/Luxi.hs                     |   4 +-
test/hs/Test/Ganeti/Objects.hs                  |   6 +-
test/hs/Test/Ganeti/OpCodes.hs                  |   6 +-
test/hs/Test/Ganeti/Query/Language.hs           |   4 +-
test/hs/Test/Ganeti/Rpc.hs                      |   4 +-
test/hs/Test/Ganeti/SlotMap.hs                  |   5 +-
test/hs/Test/Ganeti/Storage/Diskstats/Parser.hs |   4 +-
test/hs/Test/Ganeti/Storage/Lvm/LVParser.hs     |   4 +-
test/hs/Test/Ganeti/TestCommon.hs               |   6 +-
test/hs/Test/Ganeti/TestHelper.hs               |   4 +-
test/hs/Test/Ganeti/Types.hs                    |   4 +-
test/hs/Test/Ganeti/Utils.hs                    |   4 +-
test/hs/Test/Ganeti/Utils/MultiMap.hs           |   4 +-
test/hs/Test/Ganeti/WConfd/TempRes.hs           |   3 +-
test/hs/htest.hs                                |   4 +-
77 files changed, 507 insertions(+), 112 deletions(-)
create mode 100644 src/Ganeti/Prelude.hs

diff --git a/Makefile.am b/Makefile.am
index 3314f9c..3763055 100644
--- a/Makefile.am
+++ b/Makefile.am
@@ -881,6 +881,7 @@ HPCEXCL = --exclude Main \
        $(patsubst src.%,--exclude Test.%,$(subst /,.,$(patsubst %.hs,%, 
$(HS_LIB_SRCS))))

HS_LIB_SRCS = \
+       src/Ganeti/Prelude.hs \
        src/Ganeti/BasicTypes.hs \
        src/Ganeti/Codec.hs \
        src/Ganeti/Common.hs \
diff --git a/src/Ganeti/BasicTypes.hs b/src/Ganeti/BasicTypes.hs
index 5d03f32..c686283 100644
--- a/src/Ganeti/BasicTypes.hs
+++ b/src/Ganeti/BasicTypes.hs
@@ -80,6 +80,9 @@ module Ganeti.BasicTypes
  , Down(..)
  ) where

+import Prelude ()
+import Ganeti.Prelude
+
import Control.Applicative
import Control.Exception (try)
import Control.Monad
@@ -88,9 +91,8 @@ import Control.Monad.Error.Class
import Control.Monad.Trans
import Control.Monad.Trans.Control
import Data.Function
-import Data.List
+import Data.List (find, isPrefixOf)
import Data.Maybe
-import Data.Monoid
import Data.Set (Set)
import qualified Data.Set as Set (empty)
import Text.JSON (JSON)
diff --git a/src/Ganeti/Codec.hs b/src/Ganeti/Codec.hs
index 6f36cc6..9a41499 100644
--- a/src/Ganeti/Codec.hs
+++ b/src/Ganeti/Codec.hs
@@ -37,13 +37,15 @@ module Ganeti.Codec
  , decompressZlib
  ) where

+import Prelude ()
+import Ganeti.Prelude
+
import Codec.Compression.Zlib (compress)
import qualified Codec.Compression.Zlib.Internal as I
import Control.Monad (liftM)
import Control.Monad.Error.Class (MonadError(..))
import qualified Data.ByteString.Lazy as BL
import qualified Data.ByteString.Lazy.Internal as BL
-import Data.Monoid (mempty)

import Ganeti.BasicTypes

diff --git a/src/Ganeti/Confd/Server.hs b/src/Ganeti/Confd/Server.hs
index fac0537..76ce7e6 100644
--- a/src/Ganeti/Confd/Server.hs
+++ b/src/Ganeti/Confd/Server.hs
@@ -40,7 +40,9 @@ module Ganeti.Confd.Server
  , prepMain
  ) where

-import Control.Applicative((<$>))
+import Prelude ()
+import Ganeti.Prelude
+
import Control.Concurrent
import Control.Monad (forever, liftM)
import Data.IORef
diff --git a/src/Ganeti/Confd/Utils.hs b/src/Ganeti/Confd/Utils.hs
index da9075e..4e43642 100644
--- a/src/Ganeti/Confd/Utils.hs
+++ b/src/Ganeti/Confd/Utils.hs
@@ -47,7 +47,9 @@ module Ganeti.Confd.Utils

import qualified Data.Attoparsec.Text as P

-import Control.Applicative ((*>))
+import Prelude ()
+import Ganeti.Prelude
+
import qualified Data.ByteString as B
import Data.Text (pack)
import qualified Text.JSON as J
diff --git a/src/Ganeti/Config.hs b/src/Ganeti/Config.hs
index ddbb7b1..92c4c96 100644
--- a/src/Ganeti/Config.hs
+++ b/src/Ganeti/Config.hs
@@ -82,10 +82,11 @@ module Ganeti.Config
    , instNodes
    ) where

-import Control.Applicative
+import Prelude ()
+import Ganeti.Prelude
+
import Control.Arrow ((&&&))
-import Control.Monad
-import Control.Monad.State
+import Control.Monad (liftM)
import qualified Data.Foldable as F
import Data.List (foldl', nub)
import Data.Maybe (fromMaybe)
diff --git a/src/Ganeti/ConstantUtils.hs b/src/Ganeti/ConstantUtils.hs
index 6a61cf2..3f43ea1 100644
--- a/src/Ganeti/ConstantUtils.hs
+++ b/src/Ganeti/ConstantUtils.hs
@@ -37,8 +37,10 @@ SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
-}
module Ganeti.ConstantUtils where

+import Prelude ()
+import Ganeti.Prelude
+
import Data.Char (ord)
-import Data.Monoid (Monoid(..))
import Data.Set (Set)
import qualified Data.Set as Set (difference, fromList, toList, union)

diff --git a/src/Ganeti/Cpu/LoadParser.hs b/src/Ganeti/Cpu/LoadParser.hs
index 7be0759..c321101 100644
--- a/src/Ganeti/Cpu/LoadParser.hs
+++ b/src/Ganeti/Cpu/LoadParser.hs
@@ -36,7 +36,10 @@ SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
-}
module Ganeti.Cpu.LoadParser (cpustatParser) where

-import Control.Applicative ((<*>), (<*), (*>), (<$>), (<|>))
+import Prelude ()
+import Ganeti.Prelude
+
+import Control.Applicative ((<|>))
import qualified Data.Attoparsec.Text as A
import qualified Data.Attoparsec.Combinator as AC
import Data.Attoparsec.Text (Parser)
diff --git a/src/Ganeti/DataCollectors.hs b/src/Ganeti/DataCollectors.hs
index 9c2cc3b..f2cc5ce 100644
--- a/src/Ganeti/DataCollectors.hs
+++ b/src/Ganeti/DataCollectors.hs
@@ -34,8 +34,10 @@ SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.

module Ganeti.DataCollectors( collectors ) where

+import Prelude ()
+import Ganeti.Prelude
+
import Data.Map (findWithDefault)
-import Data.Monoid (mempty)

import qualified Ganeti.DataCollectors.CPUload as CPUload
import qualified Ganeti.DataCollectors.Diagnose as Diagnose
diff --git a/src/Ganeti/DataCollectors/XenCpuLoad.hs 
b/src/Ganeti/DataCollectors/XenCpuLoad.hs
index 3ced7ad..1526b57 100644
--- a/src/Ganeti/DataCollectors/XenCpuLoad.hs
+++ b/src/Ganeti/DataCollectors/XenCpuLoad.hs
@@ -42,7 +42,10 @@ module Ganeti.DataCollectors.XenCpuLoad
  , dcUpdate
  ) where

-import Control.Applicative ((<$>), liftA2)
+import Prelude ()
+import Ganeti.Prelude
+
+import Control.Applicative (liftA2)
import Control.Arrow ((***))
import Control.Monad (liftM, when)
import Control.Monad.IO.Class (liftIO)
diff --git a/src/Ganeti/HTools/Cluster.hs b/src/Ganeti/HTools/Cluster.hs
index f89a58a..a9cca4e 100644
--- a/src/Ganeti/HTools/Cluster.hs
+++ b/src/Ganeti/HTools/Cluster.hs
@@ -82,12 +82,22 @@ module Ganeti.HTools.Cluster
  , findSplitInstances
  ) where

-import Control.Applicative ((<$>), liftA2)
+import Prelude ()
+import Ganeti.Prelude
+
+import Control.Applicative (liftA2)
import Control.Arrow ((&&&))
import Control.Monad (unless)
import qualified Data.IntSet as IntSet
import qualified Data.Set as Set
-import Data.List
+import Data.List (nub

Just a minor syntatical nit: Although the style guide doesn't say it explicitly, for all such multi-line syntactical constructs we align the columns, for example

import Data.List ( nub
                 , sortBy

etc. So please add a space in all such multi-line imports.
(I'll update the style guide to be more clear about that.)

+                 , sortBy
+                 , foldl'
+                 , intersect
+                 , partition
+                 , (\\)
+                 , sort
+                 , intercalate)
import Data.Maybe (fromJust, fromMaybe, isJust, isNothing)
import Data.Ord (comparing)
import Text.Printf (printf)
diff --git a/src/Ganeti/HTools/Dedicated.hs b/src/Ganeti/HTools/Dedicated.hs
index 206513a..00413a6 100644
--- a/src/Ganeti/HTools/Dedicated.hs
+++ b/src/Ganeti/HTools/Dedicated.hs
@@ -44,7 +44,10 @@ module Ganeti.HTools.Dedicated
  , runDedicatedAllocation
  ) where

-import Control.Applicative (liftA2, (<$>))
+import Prelude ()
+import Ganeti.Prelude
+
+import Control.Applicative (liftA2)
import Control.Arrow ((&&&))
import Control.Monad (unless, liftM, foldM, mplus)
import qualified Data.Foldable as F
diff --git a/src/Ganeti/HTools/Node.hs b/src/Ganeti/HTools/Node.hs
index 79993ad..477f15b 100644
--- a/src/Ganeti/HTools/Node.hs
+++ b/src/Ganeti/HTools/Node.hs
@@ -99,13 +99,15 @@ module Ganeti.HTools.Node
  , haveExclStorage
  ) where

+import Prelude ()
+import Ganeti.Prelude
+
import Control.Monad (liftM, liftM2)
-import Control.Applicative ((<$>), (<*>))
import qualified Data.Foldable as Foldable
import Data.Function (on)
import qualified Data.Graph as Graph
import qualified Data.IntMap as IntMap
-import Data.List hiding (group)
+import Data.List (intercalate, foldl', delete, union, sortBy, groupBy)
import qualified Data.Map as Map
import Data.Ord (comparing)
import qualified Data.Set as Set
diff --git a/src/Ganeti/JQScheduler.hs b/src/Ganeti/JQScheduler.hs
index 9ec9e1a..ac2b248 100644
--- a/src/Ganeti/JQScheduler.hs
+++ b/src/Ganeti/JQScheduler.hs
@@ -48,16 +48,29 @@ module Ganeti.JQScheduler
  , configChangeNeedsRescheduling
  ) where

-import Control.Applicative (liftA2, (<$>))
+import Prelude ()
+import Ganeti.Prelude
+
+import Control.Applicative (liftA2)
import Control.Arrow
import Control.Concurrent
import Control.Exception
-import Control.Monad
+import Control.Monad (when
+                     , mfilter
+                     , liftM
+                     , void
+                     , unless
+                     , forever
+                     , forM_)
import Control.Monad.IO.Class
import Data.Function (on)
-import Data.Functor ((<$))
import Data.IORef
-import Data.List
+import Data.List (find
+                 , deleteFirstsBy
+                 , sortBy
+                 , intercalate
+                 , partition
+                 , insertBy)
import Data.Maybe
import qualified Data.Map as Map
import Data.Ord (comparing)
diff --git a/src/Ganeti/JQueue.hs b/src/Ganeti/JQueue.hs
index bf103f7..e54fd31 100644
--- a/src/Ganeti/JQueue.hs
+++ b/src/Ganeti/JQueue.hs
@@ -82,21 +82,30 @@ module Ganeti.JQueue
    , QueuedJob(..)
    ) where

-import Control.Applicative (liftA2, (<|>), (<$>))
+import Prelude ()
+import Ganeti.Prelude hiding (id, log)
+
+import Control.Applicative (liftA2, (<|>))
import Control.Arrow (first, second)
import Control.Concurrent (forkIO, threadDelay)
import Control.Exception
import Control.Lens (over)
-import Control.Monad
+import Control.Monad (filterM
+                     , liftM
+                     , foldM
+                     , void
+                     , mfilter
+                     , when
+                     , mzero
+                     , unless
+                     , msum)
import Control.Monad.IO.Class
import Control.Monad.Trans (lift)
import Control.Monad.Trans.Maybe
-import Data.Functor ((<$))
-import Data.List
+import Data.List (stripPrefix, sortBy, isPrefixOf)
import Data.Maybe
import Data.Ord (comparing)
-- workaround what seems to be a bug in ghc 7.4's TH shadowing code
-import Prelude hiding (id, log)
import System.Directory
import System.FilePath
import System.IO.Error (isDoesNotExistError)
diff --git a/src/Ganeti/Kvmd.hs b/src/Ganeti/Kvmd.hs
index 4979396..597298b 100644
--- a/src/Ganeti/Kvmd.hs
+++ b/src/Ganeti/Kvmd.hs
@@ -59,13 +59,13 @@ SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.

module Ganeti.Kvmd where

-import Prelude hiding (rem)
+import Prelude ()
+import Ganeti.Prelude hiding (rem)

-import Control.Applicative ((<$>))
import Control.Exception (try)
import Control.Concurrent
import Control.Monad (unless, when)
-import Data.List
+import Data.List (isPrefixOf, isInfixOf)
import Data.Set (Set)
import qualified Data.Set as Set (delete, empty, insert, member)
import System.Directory
diff --git a/src/Ganeti/Lens.hs b/src/Ganeti/Lens.hs
index c7951e6..ca4719d 100644
--- a/src/Ganeti/Lens.hs
+++ b/src/Ganeti/Lens.hs
@@ -44,7 +44,10 @@ module Ganeti.Lens
  , atSet
  ) where

-import Control.Applicative ((<$>), WrappedMonad(..))
+import Prelude ()
+import Ganeti.Prelude
+
+import Control.Applicative (WrappedMonad(..))
import Control.Lens
import Control.Monad
import Data.Functor.Compose (Compose(..))
diff --git a/src/Ganeti/Locking/Allocation.hs b/src/Ganeti/Locking/Allocation.hs
index 2875d70..a17efb7 100644
--- a/src/Ganeti/Locking/Allocation.hs
+++ b/src/Ganeti/Locking/Allocation.hs
@@ -49,9 +49,12 @@ module Ganeti.Locking.Allocation
  , freeLocks
  ) where

-import Control.Applicative (liftA2, (<$>), (<*>), pure)
+import Prelude ()
+import Ganeti.Prelude
+
+import Control.Applicative (liftA2)
import Control.Arrow (second, (***))
-import Control.Monad
+import Control.Monad (unless, guard, foldM, when)
import Data.Foldable (for_, find)
import qualified Data.Map as M
import Data.Maybe (fromMaybe)
diff --git a/src/Ganeti/Locking/Locks.hs b/src/Ganeti/Locking/Locks.hs
index e5bf524..1401b4f 100644
--- a/src/Ganeti/Locking/Locks.hs
+++ b/src/Ganeti/Locking/Locks.hs
@@ -44,7 +44,9 @@ module Ganeti.Locking.Locks
  , lockLevel
  ) where

-import Control.Applicative ((<$>), (<*>), pure)
+import Prelude ()
+import Ganeti.Prelude
+
import Control.Monad ((>=>), liftM)
import Data.List (stripPrefix)
import System.Posix.Types (ProcessID)
diff --git a/src/Ganeti/Logging.hs b/src/Ganeti/Logging.hs
index 5b7eb8a..a1f42d6 100644
--- a/src/Ganeti/Logging.hs
+++ b/src/Ganeti/Logging.hs
@@ -60,7 +60,9 @@ module Ganeti.Logging
  , isDebugMode
  ) where

-import Control.Applicative ((<$>))
+import Prelude ()
+import Ganeti.Prelude
+
import Control.Monad
import Control.Monad.Error.Class (MonadError(..))
import Control.Monad.Reader
@@ -68,7 +70,6 @@ import qualified Control.Monad.RWS.Strict as RWSS
import qualified Control.Monad.State.Strict as SS
import Control.Monad.Trans.Identity
import Control.Monad.Trans.Maybe
-import Data.Monoid
import System.Log.Logger
import System.Log.Handler.Simple
import System.Log.Handler.Syslog
diff --git a/src/Ganeti/Metad/ConfigCore.hs b/src/Ganeti/Metad/ConfigCore.hs
index 41120fd..187a797 100644
--- a/src/Ganeti/Metad/ConfigCore.hs
+++ b/src/Ganeti/Metad/ConfigCore.hs
@@ -35,7 +35,9 @@ SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
-}
module Ganeti.Metad.ConfigCore where

-import Control.Applicative
+import Prelude ()
+import Ganeti.Prelude
+
import Control.Concurrent.MVar.Lifted
import Control.Monad.Base
import Control.Monad.IO.Class
diff --git a/src/Ganeti/Monitoring/Server.hs b/src/Ganeti/Monitoring/Server.hs
index 530fd5b..aaad4f4 100644
--- a/src/Ganeti/Monitoring/Server.hs
+++ b/src/Ganeti/Monitoring/Server.hs
@@ -41,15 +41,17 @@ module Ganeti.Monitoring.Server
  , DataCollector(..)
  ) where

+import Prelude ()
+import Ganeti.Prelude
+
import Control.Applicative
import Control.DeepSeq (force)
import Control.Exception.Base (evaluate)
-import Control.Monad
+import Control.Monad (void, forever, liftM, foldM, foldM_, mzero)
import Control.Monad.IO.Class
import Data.ByteString.Char8 (unpack)
import Data.Maybe (fromMaybe)
import Data.List (find)
-import Data.Monoid (mempty)
import qualified Data.Map as Map
import qualified Data.PSQueue as Queue
import Snap.Core
diff --git a/src/Ganeti/Objects.hs b/src/Ganeti/Objects.hs
index 85f3576..667d5b4 100644
--- a/src/Ganeti/Objects.hs
+++ b/src/Ganeti/Objects.hs
@@ -106,13 +106,14 @@ module Ganeti.Objects
  , module Ganeti.Objects.Maintenance
  ) where

-import Control.Applicative
+import Prelude ()
+import Ganeti.Prelude
+
import Control.Arrow (first)
import Control.Monad.State
import Data.List (foldl', intercalate)
import Data.Maybe
import qualified Data.Map as Map
-import Data.Monoid
import Data.Ord (comparing)
import Data.Ratio (numerator, denominator)
import Data.Tuple (swap)
diff --git a/src/Ganeti/Objects/Disk.hs b/src/Ganeti/Objects/Disk.hs
index 18ae20a..f3e08da 100644
--- a/src/Ganeti/Objects/Disk.hs
+++ b/src/Ganeti/Objects/Disk.hs
@@ -36,7 +36,9 @@ SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.

module Ganeti.Objects.Disk where

-import Control.Applicative ((<*>), (<$>))
+import Prelude ()
+import Ganeti.Prelude
+
import Data.Char (isAsciiLower, isAsciiUpper, isDigit)
import Data.List (isPrefixOf, isInfixOf)
import Language.Haskell.TH.Syntax
diff --git a/src/Ganeti/Objects/Instance.hs b/src/Ganeti/Objects/Instance.hs
index 238898f..d25e134 100644
--- a/src/Ganeti/Objects/Instance.hs
+++ b/src/Ganeti/Objects/Instance.hs
@@ -36,7 +36,8 @@ SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.

module Ganeti.Objects.Instance where

-import Data.Monoid
+import Prelude ()
+import Ganeti.Prelude

import Ganeti.JSON (emptyContainer)
import Ganeti.Objects.Nic
diff --git a/src/Ganeti/OpCodes.hs b/src/Ganeti/OpCodes.hs
index 0820d2e..7058d85 100644
--- a/src/Ganeti/OpCodes.hs
+++ b/src/Ganeti/OpCodes.hs
@@ -56,7 +56,9 @@ module Ganeti.OpCodes
  , setOpPriority
  ) where

-import Control.Applicative
+import Prelude ()
+import Ganeti.Prelude
+
import Data.List (intercalate)
import Data.Map (Map)
import qualified Text.JSON
diff --git a/src/Ganeti/Parsers.hs b/src/Ganeti/Parsers.hs
index 10b0e41..8671b9e 100644
--- a/src/Ganeti/Parsers.hs
+++ b/src/Ganeti/Parsers.hs
@@ -37,7 +37,9 @@ SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
-}
module Ganeti.Parsers where

-import Control.Applicative ((*>))
+import Prelude ()
+import Ganeti.Prelude
+
import qualified Data.Attoparsec.Text as A
import Data.Attoparsec.Text (Parser)
import Data.Text (unpack)
diff --git a/src/Ganeti/Prelude.hs b/src/Ganeti/Prelude.hs
new file mode 100644
index 0000000..b2a3e0e
--- /dev/null
+++ b/src/Ganeti/Prelude.hs
@@ -0,0 +1,218 @@
+{-# LANGUAGE NoImplicitPrelude, CPP, BangPatterns #-}
+
+{-| Export Prelude as in base 4.8.0
+
+-}
+
+{-
+
+Copyright (C) 2015 Google Inc.
+All rights reserved.
+
+Redistribution and use in source and binary forms, with or without
+modification, are permitted provided that the following conditions are
+met:
+
+1. Redistributions of source code must retain the above copyright notice,
+this list of conditions and the following disclaimer.
+
+2. Redistributions in binary form must reproduce the above copyright
+notice, this list of conditions and the following disclaimer in the
+documentation and/or other materials provided with the distribution.
+
+THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS
+IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
+TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR
+CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
+EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
+PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
+PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
+LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
+NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
+SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+
+-}
+
+module Ganeti.Prelude (
+
+    -- * Standard types, classes and related functions
+
+    -- ** Basic data types
+    Bool(False, True),
+    (&&), (||), not, otherwise,
+
+    Maybe(Nothing, Just),
+    maybe,
+
+    Either(Left, Right),
+    either,
+
+    Ordering(LT, EQ, GT),
+    Char, String,
+
+    -- *** Tuples
+    fst, snd, curry, uncurry,
+
+    -- ** Basic type classes
+    Eq((==), (/=)),
+    Ord(compare, (<), (<=), (>=), (>), max, min),
+    Enum(succ, pred, toEnum, fromEnum, enumFrom, enumFromThen,
+         enumFromTo, enumFromThenTo),
+    Bounded(minBound, maxBound),
+
+    -- ** Numbers
+
+    -- *** Numeric types
+    Int, Integer, Float, Double,
+    Rational, Word,
+
+    -- *** Numeric type classes
+    Num((+), (-), (*), negate, abs, signum, fromInteger),
+    Real(toRational),
+    Integral(quot, rem, div, mod, quotRem, divMod, toInteger),
+    Fractional((/), recip, fromRational),
+    Floating(pi, exp, log, sqrt, (**), logBase, sin, cos, tan,
+             asin, acos, atan, sinh, cosh, tanh, asinh, acosh, atanh),
+    RealFrac(properFraction, truncate, round, ceiling, floor),
+    RealFloat(floatRadix, floatDigits, floatRange, decodeFloat,
+              encodeFloat, exponent, significand, scaleFloat, isNaN,
+              isInfinite, isDenormalized, isIEEE, isNegativeZero, atan2),
+
+    -- *** Numeric functions
+    subtract, even, odd, gcd, lcm, (^), (^^),
+    fromIntegral, realToFrac,
+
+    -- ** Monoids
+    Monoid(mempty, mappend, mconcat),
+
+    -- ** Monads and functors
+    Functor(fmap, (<$)), (<$>),
+    Applicative(pure, (<*>), (*>), (<*)),
+    Monad((>>=), (>>), return, fail),
+    mapM_, sequence_, (=<<),
+
+#if MIN_VERSION_base(4,8,0)
+    -- ** Folds and traversals
+    Foldable(elem,      -- :: (Foldable t, Eq a) => a -> t a -> Bool
+             -- fold,   -- :: Monoid m => t m -> m
+             foldMap,   -- :: Monoid m => (a -> m) -> t a -> m
+             foldr,     -- :: (a -> b -> b) -> b -> t a -> b
+             -- foldr', -- :: (a -> b -> b) -> b -> t a -> b
+             foldl,     -- :: (b -> a -> b) -> b -> t a -> b
+             -- foldl', -- :: (b -> a -> b) -> b -> t a -> b
+             foldr1,    -- :: (a -> a -> a) -> t a -> a
+             foldl1,    -- :: (a -> a -> a) -> t a -> a
+             maximum,   -- :: (Foldable t, Ord a) => t a -> a
+             minimum,   -- :: (Foldable t, Ord a) => t a -> a
+             product,   -- :: (Foldable t, Num a) => t a -> a
+             sum),      -- :: Num a => t a -> a
+             -- toList) -- :: Foldable t => t a -> [a]
+#else
+    Foldable(foldMap,
+             foldr,
+             foldl,
+             foldr1,
+             foldl1),
+    elem,
+    maximum,
+    minimum,
+    product,
+    sum,
+#endif
+
+    Traversable(traverse, sequenceA, mapM, sequence),
+
+    -- ** Miscellaneous functions
+    id, const, (.), flip, ($), until,
+    asTypeOf, error, undefined,
+    seq, ($!),
+
+    -- * List operations
+    map, (++), filter,
+    head, last, tail, init, null, length, (!!),
+    reverse,
+    -- *** Special folds
+    and, or, any, all,
+    concat, concatMap,
+    -- ** Building lists
+    -- *** Scans
+    scanl, scanl1, scanr, scanr1,
+    -- *** Infinite lists
+    iterate, repeat, replicate, cycle,
+    -- ** Sublists
+    take, drop, splitAt, takeWhile, dropWhile, span, break,
+    -- ** Searching lists
+    notElem, lookup,
+    -- ** Zipping and unzipping lists
+    zip, zip3, zipWith, zipWith3, unzip, unzip3,
+    -- ** Functions on strings
+    lines, words, unlines, unwords,
+
+    -- * Converting to and from @String@
+    -- ** Converting to @String@
+    ShowS,
+    Show(showsPrec, showList, show),
+    shows,
+    showChar, showString, showParen,
+    -- ** Converting from @String@
+    ReadS,
+    Read(readsPrec, readList),
+    reads, readParen, read, lex,
+
+    -- * Basic Input and output
+    IO,
+    -- ** Simple I\/O operations
+    -- All I/O functions defined here are character oriented.  The
+    -- treatment of the newline character will vary on different systems.
+    -- For example, two characters of input, return and linefeed, may
+    -- read as a single newline character.  These functions cannot be
+    -- used portably for binary I/O.
+    -- *** Output functions
+    putChar,
+    putStr, putStrLn, print,
+    -- *** Input functions
+    getChar,
+    getLine, getContents, interact,
+    -- *** Files
+    FilePath,
+    readFile, writeFile, appendFile, readIO, readLn,
+    -- ** Exception handling in the I\/O monad
+    IOError, ioError, userError,
+
+  ) where
+
+import Control.Monad
+import System.IO
+import System.IO.Error
+import Data.Either
+import Data.Maybe
+import Data.Traversable ( Traversable(..) )
+import Data.Tuple
+
+import Text.Read
+import GHC.Enum
+import GHC.Num
+import GHC.Real
+import GHC.Float
+import GHC.Show
+
+#if MIN_VERSION_base(4,8,0)
+import Data.Foldable    ( Foldable(..) )
+import Data.Functor     ( (<$>) )
+import Data.List
+import GHC.Base hiding ( foldr, mapM, sequence )
+#else
+import Data.Foldable    ( Foldable(..), elem, maximum, minimum, sum, product )
+import Data.List hiding ( elem, maximum, minimum, sum, product )
+import Control.Applicative
+import Data.Monoid
+import Data.Word
+import GHC.Base
+import GHC.Err (undefined)
+
+infixr 0 $!
+($!)    :: (a -> b) -> a -> b
+f $! x  = let !vx = x in f vx  -- see #2273

Why is `$!` declared explicitly? Why not just import it from the standard Prelude?

+
+#endif
diff --git a/src/Ganeti/Query/Exec.hs b/src/Ganeti/Query/Exec.hs
index 4b2945b..79889ff 100644
--- a/src/Ganeti/Query/Exec.hs
+++ b/src/Ganeti/Query/Exec.hs
@@ -60,12 +60,14 @@ module Ganeti.Query.Exec
  , forkJobProcess
  ) where

+import Prelude ()
+import Ganeti.Prelude
+
import Control.Concurrent (rtsSupportsBoundThreads)
import Control.Concurrent.Lifted (threadDelay)
import Control.Exception (finally)
import Control.Monad
import Control.Monad.Error.Class (MonadError(..))
-import Data.Functor
import qualified Data.Map as M
import Data.Maybe (listToMaybe, mapMaybe)
import System.Directory (getDirectoryContents)
diff --git a/src/Ganeti/Query/Filter.hs b/src/Ganeti/Query/Filter.hs
index aaae425..cddc4d8 100644
--- a/src/Ganeti/Query/Filter.hs
+++ b/src/Ganeti/Query/Filter.hs
@@ -66,13 +66,14 @@ module Ganeti.Query.Filter
  , FilterOp(..)
  ) where

-import Control.Applicative
+import Prelude ()
+import Ganeti.Prelude
+
import Control.Monad (liftM, mzero)
import Control.Monad.Trans.Maybe (MaybeT, runMaybeT)
import Control.Monad.Trans.Class (lift)
import qualified Data.Map as Map
import Data.Maybe
-import Data.Traversable (traverse)
import Text.JSON (JSValue(..), fromJSString)
import Text.JSON.Pretty (pp_value)
import qualified Text.Regex.PCRE as PCRE
diff --git a/src/Ganeti/Query/Language.hs b/src/Ganeti/Query/Language.hs
index 4b85ee7..3c6919f 100644
--- a/src/Ganeti/Query/Language.hs
+++ b/src/Ganeti/Query/Language.hs
@@ -65,10 +65,11 @@ module Ganeti.Query.Language
    , checkRS
    ) where

-import Control.Applicative
+import Prelude ()
+import Ganeti.Prelude
+
import Control.DeepSeq
import Data.Foldable
-import Data.Traversable (Traversable)
import Data.Ratio (numerator, denominator)
import Text.JSON.Pretty (pp_value)
import Text.JSON.Types
diff --git a/src/Ganeti/Query/Node.hs b/src/Ganeti/Query/Node.hs
index 17c3469..ecf5dc2 100644
--- a/src/Ganeti/Query/Node.hs
+++ b/src/Ganeti/Query/Node.hs
@@ -38,8 +38,10 @@ module Ganeti.Query.Node
  , collectLiveData
  ) where

-import Control.Applicative
-import Data.List
+import Prelude ()
+import Ganeti.Prelude
+
+import Data.List (intercalate)
import Data.Maybe
import qualified Data.Map as Map
import qualified Text.JSON as J
diff --git a/src/Ganeti/Query/Server.hs b/src/Ganeti/Query/Server.hs
index bf63cfa..df5da87 100644
--- a/src/Ganeti/Query/Server.hs
+++ b/src/Ganeti/Query/Server.hs
@@ -40,7 +40,9 @@ module Ganeti.Query.Server
  , prepMain
  ) where

-import Control.Applicative
+import Prelude ()
+import Ganeti.Prelude
+
import Control.Concurrent
import Control.Exception
import Control.Lens ((.~))
diff --git a/src/Ganeti/Ssconf.hs b/src/Ganeti/Ssconf.hs
index 99ad3e5..e3fc864 100644
--- a/src/Ganeti/Ssconf.hs
+++ b/src/Ganeti/Ssconf.hs
@@ -54,8 +54,10 @@ module Ganeti.Ssconf
  , emptySSConf
  ) where

+import Prelude ()
+import Ganeti.Prelude
+
import Control.Arrow ((&&&))
-import Control.Applicative ((<$>))
import Control.Exception
import Control.Monad (forM, liftM)
import qualified Data.Map as M
diff --git a/src/Ganeti/Storage/Diskstats/Parser.hs 
b/src/Ganeti/Storage/Diskstats/Parser.hs
index 64d3885..6f64b04 100644
--- a/src/Ganeti/Storage/Diskstats/Parser.hs
+++ b/src/Ganeti/Storage/Diskstats/Parser.hs
@@ -36,7 +36,9 @@ SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
-}
module Ganeti.Storage.Diskstats.Parser (diskstatsParser) where

-import Control.Applicative ((<*>), (<*), (<$>))
+import Prelude ()
+import Ganeti.Prelude
+
import qualified Data.Attoparsec.Text as A
import qualified Data.Attoparsec.Combinator as AC
import Data.Attoparsec.Text (Parser)
diff --git a/src/Ganeti/Storage/Drbd/Parser.hs 
b/src/Ganeti/Storage/Drbd/Parser.hs
index c9c8dce..8dee72c 100644
--- a/src/Ganeti/Storage/Drbd/Parser.hs
+++ b/src/Ganeti/Storage/Drbd/Parser.hs
@@ -36,7 +36,10 @@ SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
-}
module Ganeti.Storage.Drbd.Parser (drbdStatusParser, commaIntParser) where

-import Control.Applicative ((<*>), (*>), (<*), (<$>), (<|>), pure)
+import Prelude ()
+import Ganeti.Prelude
+
+import Control.Applicative ((<|>))
import qualified Data.Attoparsec.Text as A
import qualified Data.Attoparsec.Combinator as AC
import Data.Attoparsec.Text (Parser)
diff --git a/src/Ganeti/Storage/Lvm/LVParser.hs 
b/src/Ganeti/Storage/Lvm/LVParser.hs
index 470c41a..cf31431 100644
--- a/src/Ganeti/Storage/Lvm/LVParser.hs
+++ b/src/Ganeti/Storage/Lvm/LVParser.hs
@@ -37,7 +37,9 @@ SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
-}
module Ganeti.Storage.Lvm.LVParser (lvParser, lvCommand, lvParams) where

-import Control.Applicative ((<*>), (*>), (<*), (<$>))
+import Prelude ()
+import Ganeti.Prelude
+
import qualified Data.Attoparsec.Text as A
import qualified Data.Attoparsec.Combinator as AC
import Data.Attoparsec.Text (Parser)
diff --git a/src/Ganeti/THH.hs b/src/Ganeti/THH.hs
index 26ab165..fd7857e 100644
--- a/src/Ganeti/THH.hs
+++ b/src/Ganeti/THH.hs
@@ -76,11 +76,14 @@ module Ganeti.THH ( declareSADT
                  , ssconfConstructorName
                  ) where

+import Prelude ()
+import Ganeti.Prelude
+
import Control.Arrow ((&&&), second)
import Control.Applicative
import Control.Lens.Type (Lens, Lens')
import Control.Lens (lens, set, element)
-import Control.Monad
+import Control.Monad (liftM, replicateM, when, unless)
import Control.Monad.Base () -- Needed to prevent spurious GHC linking errors.
import Control.Monad.Writer (tell)
import qualified Control.Monad.Trans as MT
@@ -89,10 +92,9 @@ import Data.Attoparsec.Text ()
  -- See issue #683 and https://ghc.haskell.org/trac/ghc/ticket/4899
import Data.Char
import Data.Function (on)
-import Data.List
+import Data.List (intercalate, groupBy, stripPrefix, sort, nub)
import Data.Maybe
import qualified Data.Map as M
-import Data.Monoid
import qualified Data.Set as S
import Language.Haskell.TH
import Language.Haskell.TH.Syntax (lift)
diff --git a/src/Ganeti/THH/HsRPC.hs b/src/Ganeti/THH/HsRPC.hs
index 8a352fa..8bcdb4d 100644
--- a/src/Ganeti/THH/HsRPC.hs
+++ b/src/Ganeti/THH/HsRPC.hs
@@ -43,11 +43,13 @@ module Ganeti.THH.HsRPC
  , mkRpcCalls
  ) where

-import Control.Applicative
-import Control.Monad
+import Prelude ()
+import Ganeti.Prelude
+
+import Control.Monad (liftM)
import Control.Monad.Base
import Control.Monad.Error.Class (MonadError)
-import Control.Monad.Reader
+import Control.Monad.Reader (ReaderT, runReaderT, ask)
import Control.Monad.Trans.Control
import Language.Haskell.TH
import qualified Text.JSON as J
diff --git a/src/Ganeti/THH/PyRPC.hs b/src/Ganeti/THH/PyRPC.hs
index eee1554..81e9223 100644
--- a/src/Ganeti/THH/PyRPC.hs
+++ b/src/Ganeti/THH/PyRPC.hs
@@ -40,9 +40,11 @@ module Ganeti.THH.PyRPC
  , genPyUDSRpcStubStr
  ) where

-import Control.Monad
+import Prelude ()
+import Ganeti.Prelude
+
+import Control.Monad (liftM, zipWithM)
import Data.Char (toLower, toUpper)
-import Data.Functor
import Data.Maybe (fromMaybe)
import Language.Haskell.TH
import Language.Haskell.TH.Syntax (liftString)
diff --git a/src/Ganeti/THH/PyType.hs b/src/Ganeti/THH/PyType.hs
index a3dbe44..9a32f16 100644
--- a/src/Ganeti/THH/PyType.hs
+++ b/src/Ganeti/THH/PyType.hs
@@ -39,8 +39,10 @@ module Ganeti.THH.PyType
  , pyOptionalType
  ) where

-import Control.Applicative
-import Control.Monad
+import Prelude ()
+import Ganeti.Prelude
+
+import Control.Monad (ap, liftM)
import Data.List (intercalate)
import Language.Haskell.TH
import Language.Haskell.TH.Syntax (Lift(..))
diff --git a/src/Ganeti/THH/RPC.hs b/src/Ganeti/THH/RPC.hs
index 4b019ee..1cb63ec 100644
--- a/src/Ganeti/THH/RPC.hs
+++ b/src/Ganeti/THH/RPC.hs
@@ -42,7 +42,9 @@ module Ganeti.THH.RPC
  , mkRpcM
  ) where

-import Control.Applicative
+import Prelude ()
+import Ganeti.Prelude
+
import Control.Arrow ((&&&))
import Control.Monad
import Control.Monad.Error.Class (MonadError(..))
diff --git a/src/Ganeti/Types.hs b/src/Ganeti/Types.hs
index 52c30f1..1cfcfb0 100644
--- a/src/Ganeti/Types.hs
+++ b/src/Ganeti/Types.hs
@@ -188,7 +188,9 @@ module Ganeti.Types
  , TagsObject(..)
  ) where

-import Control.Applicative
+import Prelude ()
+import Ganeti.Prelude
+
import Control.Monad (liftM)
import qualified Text.JSON as JSON
import Text.JSON (JSON, readJSON, showJSON)
diff --git a/src/Ganeti/UDSServer.hs b/src/Ganeti/UDSServer.hs
index 8e27c5a..36f0ac1 100644
--- a/src/Ganeti/UDSServer.hs
+++ b/src/Ganeti/UDSServer.hs
@@ -70,7 +70,9 @@ module Ganeti.UDSServer
  , listener
  ) where

-import Control.Applicative
+import Prelude ()
+import Ganeti.Prelude
+
import Control.Concurrent.Lifted (fork, yield)
import Control.Monad.Base
import Control.Monad.Trans.Control
@@ -81,7 +83,7 @@ import qualified Data.ByteString.Lazy as BL
import qualified Data.ByteString.UTF8 as UTF8
import qualified Data.ByteString.Lazy.UTF8 as UTF8L
import Data.IORef
-import Data.List
+import Data.List (isInfixOf)
import Data.Word (Word8)
import qualified Network.Socket as S
import System.Directory (removeFile)
diff --git a/src/Ganeti/Utils.hs b/src/Ganeti/Utils.hs
index 0c599bb..d217914 100644
--- a/src/Ganeti/Utils.hs
+++ b/src/Ganeti/Utils.hs
@@ -101,7 +101,9 @@ module Ganeti.Utils
  , threadDelaySeconds
  ) where

-import Control.Applicative
+import Prelude ()
+import Ganeti.Prelude
+
import Control.Concurrent
import Control.Exception (try, bracket)
import Control.Monad
@@ -114,7 +116,13 @@ import Data.IORef
#if MIN_VERSION_base(4,8,0)
import Data.List hiding (isSubsequenceOf)
#else
-import Data.List
+import Data.List (intercalate
+                 , find
+                 , foldl'
+                 , transpose
+                 , sortBy
+                 , isPrefixOf
+                 , maximumBy)
#endif
import qualified Data.Map as M
import Data.Maybe (fromMaybe)
diff --git a/src/Ganeti/Utils/MultiMap.hs b/src/Ganeti/Utils/MultiMap.hs
index 0f97e26..6f46e1d 100644
--- a/src/Ganeti/Utils/MultiMap.hs
+++ b/src/Ganeti/Utils/MultiMap.hs
@@ -54,13 +54,13 @@ module Ganeti.Utils.MultiMap
  , values
  ) where

-import Prelude hiding (lookup, null, elem)
+import Prelude ()
+import Ganeti.Prelude hiding (lookup, null, elem)

import Control.Monad
import qualified Data.Foldable as F
import qualified Data.Map as M
import Data.Maybe (fromMaybe, isJust)
-import Data.Monoid
import qualified Data.Set as S
import qualified Text.JSON as J

diff --git a/src/Ganeti/Utils/Random.hs b/src/Ganeti/Utils/Random.hs
index 500e00d..bdccd4e 100644
--- a/src/Ganeti/Utils/Random.hs
+++ b/src/Ganeti/Utils/Random.hs
@@ -38,7 +38,9 @@ module Ganeti.Utils.Random
  , delayRandom
  ) where

-import Control.Applicative
+import Prelude ()
+import Ganeti.Prelude
+
import Control.Concurrent (threadDelay)
import Control.Monad
import Control.Monad.State
diff --git a/src/Ganeti/Utils/Validate.hs b/src/Ganeti/Utils/Validate.hs
index 8dda1b0..cab6b90 100644
--- a/src/Ganeti/Utils/Validate.hs
+++ b/src/Ganeti/Utils/Validate.hs
@@ -51,7 +51,9 @@ module Ganeti.Utils.Validate
  , validate'
  ) where

-import Control.Applicative
+import Prelude ()
+import Ganeti.Prelude
+
import Control.Arrow
import Control.Monad
import Control.Monad.Error.Class (MonadError(..))
diff --git a/src/Ganeti/WConfd/ConfigModifications.hs 
b/src/Ganeti/WConfd/ConfigModifications.hs
index e476c30..13a7df2 100644
--- a/src/Ganeti/WConfd/ConfigModifications.hs
+++ b/src/Ganeti/WConfd/ConfigModifications.hs
@@ -40,7 +40,9 @@ SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.

module Ganeti.WConfd.ConfigModifications where

-import Control.Applicative ((<$>))
+import Prelude ()
+import Ganeti.Prelude
+
import Control.Lens (_2)
import Control.Lens.Getter ((^.))
import Control.Lens.Setter (Setter, (.~), (%~), (+~), over)
@@ -51,7 +53,7 @@ import Control.Monad.Error.Class (throwError, MonadError)
import Control.Monad.IO.Class (liftIO)
import Control.Monad.Trans.State (StateT, get, put, modify,
                                  runStateT, execStateT)
-import Data.Foldable (fold, foldMap)
+import Data.Foldable (fold)
import Data.List (elemIndex)
import Data.Maybe (isJust, maybeToList, fromMaybe, fromJust)
import Language.Haskell.TH (Name)
diff --git a/src/Ganeti/WConfd/ConfigState.hs b/src/Ganeti/WConfd/ConfigState.hs
index fa6e754..b41fda1 100644
--- a/src/Ganeti/WConfd/ConfigState.hs
+++ b/src/Ganeti/WConfd/ConfigState.hs
@@ -43,7 +43,9 @@ module Ganeti.WConfd.ConfigState
  , needsFullDist
  ) where

-import Control.Applicative
+import Prelude ()
+import Ganeti.Prelude
+
import Data.Function (on)
import System.Time (ClockTime(..))

diff --git a/src/Ganeti/WConfd/ConfigWriter.hs 
b/src/Ganeti/WConfd/ConfigWriter.hs
index ba7a84d..92fbf34 100644
--- a/src/Ganeti/WConfd/ConfigWriter.hs
+++ b/src/Ganeti/WConfd/ConfigWriter.hs
@@ -43,7 +43,10 @@ module Ganeti.WConfd.ConfigWriter
  , distSSConfAsyncTask
  ) where

-import Control.Applicative
+import Prelude ()
+import Ganeti.Prelude
+
+import Control.Monad ((>=>), liftM, unless)
import Control.Monad.Base
import Control.Monad.Error.Class (MonadError)
import qualified Control.Monad.State.Strict as S
diff --git a/src/Ganeti/WConfd/Monad.hs b/src/Ganeti/WConfd/Monad.hs
index f028c84..a59320f 100644
--- a/src/Ganeti/WConfd/Monad.hs
+++ b/src/Ganeti/WConfd/Monad.hs
@@ -68,7 +68,9 @@ module Ganeti.WConfd.Monad
  , readTempResState
  ) where

-import Control.Applicative
+import Prelude ()
+import Ganeti.Prelude
+
import Control.Arrow ((&&&), second)
import Control.Concurrent (forkIO, myThreadId)
import Control.Exception.Lifted (bracket)
diff --git a/src/Ganeti/WConfd/TempRes.hs b/src/Ganeti/WConfd/TempRes.hs
index e478a3b..5aa6343 100644
--- a/src/Ganeti/WConfd/TempRes.hs
+++ b/src/Ganeti/WConfd/TempRes.hs
@@ -73,7 +73,9 @@ module Ganeti.WConfd.TempRes
  , reserved
  ) where

-import Control.Applicative
+import Prelude ()
+import Ganeti.Prelude
+
import Control.Lens.At
import Control.Monad.Error.Class (MonadError(..))
import Control.Monad.State
diff --git a/test/hs/Test/Ganeti/BasicTypes.hs 
b/test/hs/Test/Ganeti/BasicTypes.hs
index f29d16f..e9ed399 100644
--- a/test/hs/Test/Ganeti/BasicTypes.hs
+++ b/test/hs/Test/Ganeti/BasicTypes.hs
@@ -37,10 +37,12 @@ SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.

module Test.Ganeti.BasicTypes (testBasicTypes) where

+import Prelude ()
+import Ganeti.Prelude
+
import Test.QuickCheck hiding (Result)
import Test.QuickCheck.Function

-import Control.Applicative
import Control.Monad

import Test.Ganeti.TestHelper
diff --git a/test/hs/Test/Ganeti/Confd/Types.hs 
b/test/hs/Test/Ganeti/Confd/Types.hs
index 3bc7167..6e7cb29 100644
--- a/test/hs/Test/Ganeti/Confd/Types.hs
+++ b/test/hs/Test/Ganeti/Confd/Types.hs
@@ -42,7 +42,9 @@ module Test.Ganeti.Confd.Types
  , ConfdReqQ(..)
  ) where

-import Control.Applicative
+import Prelude ()
+import Ganeti.Prelude
+
import Test.QuickCheck
import Test.HUnit
import qualified Text.JSON as J
diff --git a/test/hs/Test/Ganeti/HTools/Instance.hs 
b/test/hs/Test/Ganeti/HTools/Instance.hs
index dcd4b79..84a5f5c 100644
--- a/test/hs/Test/Ganeti/HTools/Instance.hs
+++ b/test/hs/Test/Ganeti/HTools/Instance.hs
@@ -44,8 +44,10 @@ module Test.Ganeti.HTools.Instance
  , Instance.Instance(..)
  ) where

+import Prelude ()
+import Ganeti.Prelude
+
import Control.Arrow ((&&&))
-import Control.Applicative ((<$>))
import Control.Monad (liftM)
import Test.QuickCheck hiding (Result)

diff --git a/test/hs/Test/Ganeti/HTools/Types.hs 
b/test/hs/Test/Ganeti/HTools/Types.hs
index 7708b0a..f643f3b 100644
--- a/test/hs/Test/Ganeti/HTools/Types.hs
+++ b/test/hs/Test/Ganeti/HTools/Types.hs
@@ -45,10 +45,12 @@ module Test.Ganeti.HTools.Types
  , nullIPolicy
  ) where

+import Prelude ()
+import Ganeti.Prelude
+
import Test.QuickCheck hiding (Result)
import Test.HUnit

-import Control.Applicative
import Control.Monad (replicateM)

import Test.Ganeti.TestHelper
diff --git a/test/hs/Test/Ganeti/JQScheduler.hs 
b/test/hs/Test/Ganeti/JQScheduler.hs
index a0aa650..3d79877 100644
--- a/test/hs/Test/Ganeti/JQScheduler.hs
+++ b/test/hs/Test/Ganeti/JQScheduler.hs
@@ -37,14 +37,15 @@ SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.

module Test.Ganeti.JQScheduler (testJQScheduler) where

-import Control.Applicative
+import Prelude ()
+import Ganeti.Prelude
+
import Control.Lens ((&), (.~), _2)
import Data.List (inits)
import Data.Maybe
import qualified Data.Map as Map
import Data.Set (Set, difference)
import qualified Data.Set as Set
-import Data.Traversable (traverse)
import Text.JSON (JSValue(..))
import Test.HUnit
import Test.QuickCheck
diff --git a/test/hs/Test/Ganeti/JQueue/Objects.hs 
b/test/hs/Test/Ganeti/JQueue/Objects.hs
index 13e0f0f..6d56a5d 100644
--- a/test/hs/Test/Ganeti/JQueue/Objects.hs
+++ b/test/hs/Test/Ganeti/JQueue/Objects.hs
@@ -39,7 +39,9 @@ module Test.Ganeti.JQueue.Objects
  , genJobId
  ) where

-import Control.Applicative
+import Prelude ()
+import Ganeti.Prelude
+
import Test.QuickCheck as QuickCheck
import Text.JSON

diff --git a/test/hs/Test/Ganeti/Locking/Allocation.hs 
b/test/hs/Test/Ganeti/Locking/Allocation.hs
index a4ce21b..498d149 100644
--- a/test/hs/Test/Ganeti/Locking/Allocation.hs
+++ b/test/hs/Test/Ganeti/Locking/Allocation.hs
@@ -42,7 +42,9 @@ module Test.Ganeti.Locking.Allocation
  , requestSucceeded
  ) where

-import Control.Applicative
+import Prelude ()
+import Ganeti.Prelude
+
import qualified Data.Foldable as F
import qualified Data.Map as M
import Data.Maybe (fromMaybe)
diff --git a/test/hs/Test/Ganeti/Locking/Locks.hs 
b/test/hs/Test/Ganeti/Locking/Locks.hs
index 732779f..1c992ff 100644
--- a/test/hs/Test/Ganeti/Locking/Locks.hs
+++ b/test/hs/Test/Ganeti/Locking/Locks.hs
@@ -37,7 +37,10 @@ SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.

module Test.Ganeti.Locking.Locks (testLocking_Locks) where

-import Control.Applicative ((<$>), (<*>), liftA2)
+import Prelude ()
+import Ganeti.Prelude
+
+import Control.Applicative (liftA2)
import Control.Monad (liftM)
import System.Posix.Types (CPid)

diff --git a/test/hs/Test/Ganeti/Locking/Waiting.hs 
b/test/hs/Test/Ganeti/Locking/Waiting.hs
index ee1a6b0..1b06225 100644
--- a/test/hs/Test/Ganeti/Locking/Waiting.hs
+++ b/test/hs/Test/Ganeti/Locking/Waiting.hs
@@ -37,7 +37,10 @@ SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.

module Test.Ganeti.Locking.Waiting (testLocking_Waiting) where

-import Control.Applicative ((<$>), (<*>), liftA2)
+import Prelude ()
+import Ganeti.Prelude
+
+import Control.Applicative (liftA2)
import Control.Monad (liftM)
import qualified Data.Map as M
import qualified Data.Set as S
diff --git a/test/hs/Test/Ganeti/Luxi.hs b/test/hs/Test/Ganeti/Luxi.hs
index c269b8c..47736f4 100644
--- a/test/hs/Test/Ganeti/Luxi.hs
+++ b/test/hs/Test/Ganeti/Luxi.hs
@@ -37,12 +37,14 @@ SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.

module Test.Ganeti.Luxi (testLuxi) where

+import Prelude ()
+import Ganeti.Prelude
+
import Test.HUnit
import Test.QuickCheck
import Test.QuickCheck.Monadic (monadicIO, run, stop)

import Data.List
-import Control.Applicative
import Control.Concurrent (forkIO)
import Control.Exception (bracket)
import qualified Text.JSON as J
diff --git a/test/hs/Test/Ganeti/Objects.hs b/test/hs/Test/Ganeti/Objects.hs
index 857f822..db43835 100644
--- a/test/hs/Test/Ganeti/Objects.hs
+++ b/test/hs/Test/Ganeti/Objects.hs
@@ -49,11 +49,13 @@ module Test.Ganeti.Objects
  , genBitStringMaxLen
  ) where

+import Prelude ()
+import Ganeti.Prelude
+
import Test.QuickCheck
import qualified Test.HUnit as HUnit

-import Control.Applicative
-import Control.Monad
+import Control.Monad (liftM, when)
import Data.Char
import qualified Data.List as List
import qualified Data.Map as Map
diff --git a/test/hs/Test/Ganeti/OpCodes.hs b/test/hs/Test/Ganeti/OpCodes.hs
index 1fd4d5e..43e66b3 100644
--- a/test/hs/Test/Ganeti/OpCodes.hs
+++ b/test/hs/Test/Ganeti/OpCodes.hs
@@ -40,11 +40,13 @@ module Test.Ganeti.OpCodes
  , OpCodes.OpCode(..)
  ) where

+import Prelude ()
+import Ganeti.Prelude
+
import Test.HUnit as HUnit
import Test.QuickCheck as QuickCheck

-import Control.Applicative
-import Control.Monad
+import Control.Monad (when)
import Data.Char
import Data.List
import qualified Data.Map as Map
diff --git a/test/hs/Test/Ganeti/Query/Language.hs 
b/test/hs/Test/Ganeti/Query/Language.hs
index 9556bc3..677990a 100644
--- a/test/hs/Test/Ganeti/Query/Language.hs
+++ b/test/hs/Test/Ganeti/Query/Language.hs
@@ -41,10 +41,12 @@ module Test.Ganeti.Query.Language
  , genJSValue
  ) where

+import Prelude ()
+import Ganeti.Prelude
+
import Test.HUnit (Assertion, assertEqual)
import Test.QuickCheck

-import Control.Applicative
import Control.Arrow (second)
import Text.JSON

diff --git a/test/hs/Test/Ganeti/Rpc.hs b/test/hs/Test/Ganeti/Rpc.hs
index 54711d7..86b3ece 100644
--- a/test/hs/Test/Ganeti/Rpc.hs
+++ b/test/hs/Test/Ganeti/Rpc.hs
@@ -37,10 +37,12 @@ SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.

module Test.Ganeti.Rpc (testRpc) where

+import Prelude ()
+import Ganeti.Prelude
+
import Test.QuickCheck
import Test.QuickCheck.Monadic (monadicIO, run, stop)

-import Control.Applicative
import qualified Data.Map as Map

import Test.Ganeti.TestHelper
diff --git a/test/hs/Test/Ganeti/SlotMap.hs b/test/hs/Test/Ganeti/SlotMap.hs
index 295240d..7897c72 100644
--- a/test/hs/Test/Ganeti/SlotMap.hs
+++ b/test/hs/Test/Ganeti/SlotMap.hs
@@ -42,16 +42,15 @@ module Test.Ganeti.SlotMap
  , overfullKeys
  ) where

-import Prelude hiding (all)
+import Prelude ()
+import Ganeti.Prelude hiding (all)

-import Control.Applicative
import Control.Monad
import Data.Foldable (all)
import qualified Data.Map as Map
import Data.Map (Map, member, keys, keysSet)
import Data.Set (Set, size, union)
import qualified Data.Set as Set
-import Data.Traversable (traverse)
import Test.HUnit
import Test.QuickCheck

diff --git a/test/hs/Test/Ganeti/Storage/Diskstats/Parser.hs 
b/test/hs/Test/Ganeti/Storage/Diskstats/Parser.hs
index 8193ae9..4a63b02 100644
--- a/test/hs/Test/Ganeti/Storage/Diskstats/Parser.hs
+++ b/test/hs/Test/Ganeti/Storage/Diskstats/Parser.hs
@@ -35,13 +35,15 @@ SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.

module Test.Ganeti.Storage.Diskstats.Parser (testBlock_Diskstats_Parser) where

+import Prelude ()
+import Ganeti.Prelude
+
import Test.QuickCheck as QuickCheck hiding (Result)
import Test.HUnit

import Test.Ganeti.TestHelper
import Test.Ganeti.TestCommon

-import Control.Applicative ((<*>), (<$>))
import qualified Data.Attoparsec.Text as A
import Data.Text (pack)
import Text.Printf
diff --git a/test/hs/Test/Ganeti/Storage/Lvm/LVParser.hs 
b/test/hs/Test/Ganeti/Storage/Lvm/LVParser.hs
index 9a00799..bb1ec64 100644
--- a/test/hs/Test/Ganeti/Storage/Lvm/LVParser.hs
+++ b/test/hs/Test/Ganeti/Storage/Lvm/LVParser.hs
@@ -35,13 +35,15 @@ SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.

module Test.Ganeti.Storage.Lvm.LVParser (testStorage_Lvm_LVParser) where

+import Prelude ()
+import Ganeti.Prelude
+
import Test.QuickCheck as QuickCheck hiding (Result)
import Test.HUnit

import Test.Ganeti.TestHelper
import Test.Ganeti.TestCommon

-import Control.Applicative ((<$>), (<*>))
import Data.List (intercalate)

import Ganeti.Storage.Lvm.LVParser
diff --git a/test/hs/Test/Ganeti/TestCommon.hs 
b/test/hs/Test/Ganeti/TestCommon.hs
index bcd8421..a3f8740 100644
--- a/test/hs/Test/Ganeti/TestCommon.hs
+++ b/test/hs/Test/Ganeti/TestCommon.hs
@@ -92,9 +92,11 @@ module Test.Ganeti.TestCommon
  , counterexample
  ) where

-import Control.Applicative
+import Prelude ()
+import Ganeti.Prelude
+
import Control.Exception (catchJust)
-import Control.Monad
+import Control.Monad (guard, liftM, foldM)
import Data.Attoparsec.Text (Parser, parseOnly)
import Data.List
import qualified Data.Map as M
diff --git a/test/hs/Test/Ganeti/TestHelper.hs 
b/test/hs/Test/Ganeti/TestHelper.hs
index 399ad58..01be610 100644
--- a/test/hs/Test/Ganeti/TestHelper.hs
+++ b/test/hs/Test/Ganeti/TestHelper.hs
@@ -39,7 +39,9 @@ module Test.Ganeti.TestHelper
  , genArbitrary
  ) where

-import Control.Applicative
+import Prelude ()
+import Ganeti.Prelude
+
import Data.List (stripPrefix, isPrefixOf)
import Data.Maybe (fromMaybe)
import Test.Framework
diff --git a/test/hs/Test/Ganeti/Types.hs b/test/hs/Test/Ganeti/Types.hs
index 12f957a..5ce6dae 100644
--- a/test/hs/Test/Ganeti/Types.hs
+++ b/test/hs/Test/Ganeti/Types.hs
@@ -47,7 +47,9 @@ module Test.Ganeti.Types
  , genReasonTrail
  ) where

-import Control.Applicative
+import Prelude ()
+import Ganeti.Prelude
+
import System.Time (ClockTime(..))

import Test.QuickCheck as QuickCheck hiding (Result)
diff --git a/test/hs/Test/Ganeti/Utils.hs b/test/hs/Test/Ganeti/Utils.hs
index bee30e2..c65db11 100644
--- a/test/hs/Test/Ganeti/Utils.hs
+++ b/test/hs/Test/Ganeti/Utils.hs
@@ -37,10 +37,12 @@ SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.

module Test.Ganeti.Utils (testUtils) where

+import Prelude ()
+import Ganeti.Prelude
+
import Test.QuickCheck hiding (Result)
import Test.HUnit

-import Control.Applicative ((<$>), (<*>))
import Data.Char (isSpace)
import qualified Data.Either as Either
#if MIN_VERSION_base(4,8,0)
diff --git a/test/hs/Test/Ganeti/Utils/MultiMap.hs 
b/test/hs/Test/Ganeti/Utils/MultiMap.hs
index 3656841..02dfc46 100644
--- a/test/hs/Test/Ganeti/Utils/MultiMap.hs
+++ b/test/hs/Test/Ganeti/Utils/MultiMap.hs
@@ -39,7 +39,9 @@ module Test.Ganeti.Utils.MultiMap
  ( testUtils_MultiMap
  ) where

-import Control.Applicative
+import Prelude ()
+import Ganeti.Prelude
+
import qualified Data.Set as S
import qualified Data.Map as M

diff --git a/test/hs/Test/Ganeti/WConfd/TempRes.hs 
b/test/hs/Test/Ganeti/WConfd/TempRes.hs
index 768804c..8b8745b 100644
--- a/test/hs/Test/Ganeti/WConfd/TempRes.hs
+++ b/test/hs/Test/Ganeti/WConfd/TempRes.hs
@@ -37,7 +37,8 @@ SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.

module Test.Ganeti.WConfd.TempRes (testWConfd_TempRes) where

-import Control.Applicative
+import Prelude ()
+import Ganeti.Prelude

import Test.QuickCheck

diff --git a/test/hs/htest.hs b/test/hs/htest.hs
index 86d193e..ca83366 100644
--- a/test/hs/htest.hs
+++ b/test/hs/htest.hs
@@ -34,7 +34,9 @@ SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.

module Main(main) where

-import Data.Monoid (mappend)
+import Prelude ()
+import Ganeti.Prelude
+
import Test.Framework
import System.Environment (getArgs)
import System.Log.Logger
--
2.6.0.rc0.131.gf624c3d


Rest LGTM, thanks!

Reply via email to