Regarding ($!), we should make it so that we import it from the base libraries. I'd definitely want to avoid having our own implementation of ($!). As the GHC bug number in the comment shows, there can be subtle problems with it, and if something changes in GHC in the future, we could get into unpleasant troubles if we don't use the implementation GHC provides.

We can simply do

  import Prelude (($!))

But then the issue is that it seems that GHC.Base also exports ($!), and unfortunately only in some versions. I'd suggest to investigate, if we really need to import the various GHC.* modules. As they're considered low-level, they can change more often, so it'd be better if we could do as much imports as possible from the standard modules such as Prelude, and also use explicit imports so that we don't run into problems when things get added.

Thanks,
Petr

On Sun, Sep 13, 2015 at 12:48:57PM +0000, Aditya Bhimanavajjula wrote:
We can't import just ($!) from Prelude (Or at least I do not know how). It
is either everything or nothing.

On Wed, Sep 9, 2015 at 2:00 PM Petr Pudlak <[email protected]> wrote:

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