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!