Replace hand-written Bounded instances with derived ones
authorRyan Scott <ryan.gl.scott@gmail.com>
Sat, 4 Jun 2016 21:59:47 +0000 (17:59 -0400)
committerRyan Scott <ryan.gl.scott@gmail.com>
Sat, 4 Jun 2016 21:59:48 +0000 (17:59 -0400)
Summary:
The spiritual successor to D2291, since deriving `Bounded` instances
in `GHC.Enum` wasn't possible prior to changes made in that Diff.

This Diff finds every manually implemented `Bounded` instance in `base` that is
completely equivalent to the derived instances, and replaces it.

Reviewers: bgamari, goldfire, austin, hvr

Reviewed By: austin, hvr

Subscribers: thomie, rwbarton

Differential Revision: https://phabricator.haskell.org/D2301

libraries/base/Data/Proxy.hs
libraries/base/Data/Semigroup.hs
libraries/base/Data/Type/Coercion.hs
libraries/base/Data/Type/Equality.hs
libraries/base/GHC/Enum.hs

index f0760e8..a111558 100644 (file)
@@ -29,7 +29,7 @@ import GHC.Enum
 import GHC.Arr
 
 -- | A concrete, poly-kinded proxy type
-data Proxy t = Proxy
+data Proxy t = Proxy deriving Bounded
 
 -- | A concrete, promotable proxy type, for use at the kind level
 -- There are no instances for this because it is intended at the kind level only
@@ -70,10 +70,6 @@ instance Ix (Proxy s) where
     unsafeIndex _ _   = 0
     unsafeRangeSize _ = 1
 
-instance Bounded (Proxy s) where
-    minBound = Proxy
-    maxBound = Proxy
-
 instance Monoid (Proxy s) where
     mempty = Proxy
     mappend _ _ = Proxy
index 1f4944a..ff1e4e2 100644 (file)
@@ -290,11 +290,7 @@ instance Semigroup (NonEmpty a) where
 
 
 newtype Min a = Min { getMin :: a }
-  deriving (Eq, Ord, Show, Read, Data, Generic, Generic1)
-
-instance Bounded a => Bounded (Min a) where
-  minBound = Min minBound
-  maxBound = Min maxBound
+  deriving (Bounded, Eq, Ord, Show, Read, Data, Generic, Generic1)
 
 instance Enum a => Enum (Min a) where
   succ (Min a) = Min (succ a)
@@ -347,11 +343,7 @@ instance Num a => Num (Min a) where
   fromInteger    = Min . fromInteger
 
 newtype Max a = Max { getMax :: a }
-  deriving (Eq, Ord, Show, Read, Data, Generic, Generic1)
-
-instance Bounded a => Bounded (Max a) where
-  minBound = Max minBound
-  maxBound = Max maxBound
+  deriving (Bounded, Eq, Ord, Show, Read, Data, Generic, Generic1)
 
 instance Enum a => Enum (Max a) where
   succ (Max a) = Max (succ a)
@@ -437,11 +429,7 @@ instance Bifunctor Arg where
 -- | Use @'Option' ('First' a)@ to get the behavior of
 -- 'Data.Monoid.First' from "Data.Monoid".
 newtype First a = First { getFirst :: a } deriving
-  (Eq, Ord, Show, Read, Data, Generic, Generic1)
-
-instance Bounded a => Bounded (First a) where
-  minBound = First minBound
-  maxBound = First maxBound
+  (Bounded, Eq, Ord, Show, Read, Data, Generic, Generic1)
 
 instance Enum a => Enum (First a) where
   succ (First a) = First (succ a)
@@ -482,11 +470,7 @@ instance MonadFix First where
 -- | Use @'Option' ('Last' a)@ to get the behavior of
 -- 'Data.Monoid.Last' from "Data.Monoid"
 newtype Last a = Last { getLast :: a } deriving
-  (Eq, Ord, Show, Read, Data, Generic, Generic1)
-
-instance Bounded a => Bounded (Last a) where
-  minBound = Last minBound
-  maxBound = Last maxBound
+  (Bounded, Eq, Ord, Show, Read, Data, Generic, Generic1)
 
 instance Enum a => Enum (Last a) where
   succ (Last a) = Last (succ a)
@@ -527,7 +511,7 @@ instance MonadFix Last where
 
 -- | Provide a Semigroup for an arbitrary Monoid.
 newtype WrappedMonoid m = WrapMonoid { unwrapMonoid :: m }
-  deriving (Eq, Ord, Show, Read, Data, Generic, Generic1)
+  deriving (Bounded, Eq, Ord, Show, Read, Data, Generic, Generic1)
 
 instance Monoid m => Semigroup (WrappedMonoid m) where
   (<>) = coerce (mappend :: m -> m -> m)
@@ -536,10 +520,6 @@ instance Monoid m => Monoid (WrappedMonoid m) where
   mempty = WrapMonoid mempty
   mappend = (<>)
 
-instance Bounded a => Bounded (WrappedMonoid a) where
-  minBound = WrapMonoid minBound
-  maxBound = WrapMonoid maxBound
-
 instance Enum a => Enum (WrappedMonoid a) where
   succ (WrapMonoid a) = WrapMonoid (succ a)
   pred (WrapMonoid a) = WrapMonoid (pred a)
index cc34683..00445bc 100644 (file)
@@ -81,9 +81,7 @@ instance Coercible a b => Enum (Coercion a b) where
 
   fromEnum Coercion = 0
 
-instance Coercible a b => Bounded (Coercion a b) where
-  minBound = Coercion
-  maxBound = Coercion
+deriving instance Coercible a b => Bounded (Coercion a b)
 
 -- | This class contains types where you can learn the equality of two types
 -- from information contained in /terms/. Typically, only singleton types should
index 19c9bca..b22b39d 100644 (file)
@@ -131,9 +131,7 @@ instance a ~ b => Enum (a :~: b) where
 
   fromEnum Refl = 0
 
-instance a ~ b => Bounded (a :~: b) where
-  minBound = Refl
-  maxBound = Refl
+deriving instance a ~ b => Bounded (a :~: b)
 
 -- | This class contains types where you can learn the equality of two types
 -- from information contained in /terms/. Typically, only singleton types should
index 729b801..c0e2f5a 100644 (file)
@@ -1,5 +1,9 @@
+{-# LANGUAGE BangPatterns #-}
+{-# LANGUAGE CPP #-}
+{-# LANGUAGE MagicHash #-}
+{-# LANGUAGE NoImplicitPrelude #-}
+{-# LANGUAGE StandaloneDeriving #-}
 {-# LANGUAGE Trustworthy #-}
-{-# LANGUAGE CPP, NoImplicitPrelude, BangPatterns, MagicHash #-}
 {-# OPTIONS_HADDOCK hide #-}
 
 -----------------------------------------------------------------------------
@@ -150,10 +154,7 @@ predError inst_ty =
 -- Tuples
 ------------------------------------------------------------------------
 
-instance Bounded () where
-    minBound = ()
-    maxBound = ()
-
+deriving instance Bounded ()
 instance Enum () where
     succ _      = errorWithoutStackTrace "Prelude.Enum.().succ: bad argument"
     pred _      = errorWithoutStackTrace "Prelude.Enum.().pred: bad argument"
@@ -168,102 +169,54 @@ instance Enum () where
     enumFromThenTo () () () = let many = ():many in many
 
 -- Report requires instances up to 15
-instance (Bounded a, Bounded b) => Bounded (a,b) where
-   minBound = (minBound, minBound)
-   maxBound = (maxBound, maxBound)
-
-instance (Bounded a, Bounded b, Bounded c) => Bounded (a,b,c) where
-   minBound = (minBound, minBound, minBound)
-   maxBound = (maxBound, maxBound, maxBound)
-
-instance (Bounded a, Bounded b, Bounded c, Bounded d) => Bounded (a,b,c,d) where
-   minBound = (minBound, minBound, minBound, minBound)
-   maxBound = (maxBound, maxBound, maxBound, maxBound)
-
-instance (Bounded a, Bounded b, Bounded c, Bounded d, Bounded e) => Bounded (a,b,c,d,e) where
-   minBound = (minBound, minBound, minBound, minBound, minBound)
-   maxBound = (maxBound, maxBound, maxBound, maxBound, maxBound)
-
-instance (Bounded a, Bounded b, Bounded c, Bounded d, Bounded e, Bounded f)
-        => Bounded (a,b,c,d,e,f) where
-   minBound = (minBound, minBound, minBound, minBound, minBound, minBound)
-   maxBound = (maxBound, maxBound, maxBound, maxBound, maxBound, maxBound)
-
-instance (Bounded a, Bounded b, Bounded c, Bounded d, Bounded e, Bounded f, Bounded g)
-        => Bounded (a,b,c,d,e,f,g) where
-   minBound = (minBound, minBound, minBound, minBound, minBound, minBound, minBound)
-   maxBound = (maxBound, maxBound, maxBound, maxBound, maxBound, maxBound, maxBound)
-
-instance (Bounded a, Bounded b, Bounded c, Bounded d, Bounded e, Bounded f, Bounded g,
-          Bounded h)
-        => Bounded (a,b,c,d,e,f,g,h) where
-   minBound = (minBound, minBound, minBound, minBound, minBound, minBound, minBound, minBound)
-   maxBound = (maxBound, maxBound, maxBound, maxBound, maxBound, maxBound, maxBound, maxBound)
-
-instance (Bounded a, Bounded b, Bounded c, Bounded d, Bounded e, Bounded f, Bounded g,
-          Bounded h, Bounded i)
-        => Bounded (a,b,c,d,e,f,g,h,i) where
-   minBound = (minBound, minBound, minBound, minBound, minBound, minBound, minBound, minBound,
-               minBound)
-   maxBound = (maxBound, maxBound, maxBound, maxBound, maxBound, maxBound, maxBound, maxBound,
-               maxBound)
-
-instance (Bounded a, Bounded b, Bounded c, Bounded d, Bounded e, Bounded f, Bounded g,
-          Bounded h, Bounded i, Bounded j)
-        => Bounded (a,b,c,d,e,f,g,h,i,j) where
-   minBound = (minBound, minBound, minBound, minBound, minBound, minBound, minBound, minBound,
-               minBound, minBound)
-   maxBound = (maxBound, maxBound, maxBound, maxBound, maxBound, maxBound, maxBound, maxBound,
-               maxBound, maxBound)
-
-instance (Bounded a, Bounded b, Bounded c, Bounded d, Bounded e, Bounded f, Bounded g,
-          Bounded h, Bounded i, Bounded j, Bounded k)
-        => Bounded (a,b,c,d,e,f,g,h,i,j,k) where
-   minBound = (minBound, minBound, minBound, minBound, minBound, minBound, minBound, minBound,
-               minBound, minBound, minBound)
-   maxBound = (maxBound, maxBound, maxBound, maxBound, maxBound, maxBound, maxBound, maxBound,
-               maxBound, maxBound, maxBound)
-
-instance (Bounded a, Bounded b, Bounded c, Bounded d, Bounded e, Bounded f, Bounded g,
-          Bounded h, Bounded i, Bounded j, Bounded k, Bounded l)
-        => Bounded (a,b,c,d,e,f,g,h,i,j,k,l) where
-   minBound = (minBound, minBound, minBound, minBound, minBound, minBound, minBound, minBound,
-               minBound, minBound, minBound, minBound)
-   maxBound = (maxBound, maxBound, maxBound, maxBound, maxBound, maxBound, maxBound, maxBound,
-               maxBound, maxBound, maxBound, maxBound)
-
-instance (Bounded a, Bounded b, Bounded c, Bounded d, Bounded e, Bounded f, Bounded g,
-          Bounded h, Bounded i, Bounded j, Bounded k, Bounded l, Bounded m)
-        => Bounded (a,b,c,d,e,f,g,h,i,j,k,l,m) where
-   minBound = (minBound, minBound, minBound, minBound, minBound, minBound, minBound, minBound,
-               minBound, minBound, minBound, minBound, minBound)
-   maxBound = (maxBound, maxBound, maxBound, maxBound, maxBound, maxBound, maxBound, maxBound,
-               maxBound, maxBound, maxBound, maxBound, maxBound)
-
-instance (Bounded a, Bounded b, Bounded c, Bounded d, Bounded e, Bounded f, Bounded g,
-          Bounded h, Bounded i, Bounded j, Bounded k, Bounded l, Bounded m, Bounded n)
-        => Bounded (a,b,c,d,e,f,g,h,i,j,k,l,m,n) where
-   minBound = (minBound, minBound, minBound, minBound, minBound, minBound, minBound, minBound,
-               minBound, minBound, minBound, minBound, minBound, minBound)
-   maxBound = (maxBound, maxBound, maxBound, maxBound, maxBound, maxBound, maxBound, maxBound,
-               maxBound, maxBound, maxBound, maxBound, maxBound, maxBound)
-
-instance (Bounded a, Bounded b, Bounded c, Bounded d, Bounded e, Bounded f, Bounded g,
-          Bounded h, Bounded i, Bounded j, Bounded k, Bounded l, Bounded m, Bounded n, Bounded o)
-        => Bounded (a,b,c,d,e,f,g,h,i,j,k,l,m,n,o) where
-   minBound = (minBound, minBound, minBound, minBound, minBound, minBound, minBound, minBound,
-               minBound, minBound, minBound, minBound, minBound, minBound, minBound)
-   maxBound = (maxBound, maxBound, maxBound, maxBound, maxBound, maxBound, maxBound, maxBound,
-               maxBound, maxBound, maxBound, maxBound, maxBound, maxBound, maxBound)
+deriving instance (Bounded a, Bounded b)
+        => Bounded (a,b)
+deriving instance (Bounded a, Bounded b, Bounded c)
+        => Bounded (a,b,c)
+deriving instance (Bounded a, Bounded b, Bounded c, Bounded d)
+        => Bounded (a,b,c,d)
+deriving instance (Bounded a, Bounded b, Bounded c, Bounded d, Bounded e)
+        => Bounded (a,b,c,d,e)
+deriving instance (Bounded a, Bounded b, Bounded c, Bounded d, Bounded e,
+          Bounded f)
+        => Bounded (a,b,c,d,e,f)
+deriving instance (Bounded a, Bounded b, Bounded c, Bounded d, Bounded e,
+          Bounded f, Bounded g)
+        => Bounded (a,b,c,d,e,f,g)
+deriving instance (Bounded a, Bounded b, Bounded c, Bounded d, Bounded e,
+          Bounded f, Bounded g, Bounded h)
+        => Bounded (a,b,c,d,e,f,g,h)
+deriving instance (Bounded a, Bounded b, Bounded c, Bounded d, Bounded e,
+          Bounded f, Bounded g, Bounded h, Bounded i)
+        => Bounded (a,b,c,d,e,f,g,h,i)
+deriving instance (Bounded a, Bounded b, Bounded c, Bounded d, Bounded e,
+          Bounded f, Bounded g, Bounded h, Bounded i, Bounded j)
+        => Bounded (a,b,c,d,e,f,g,h,i,j)
+deriving instance (Bounded a, Bounded b, Bounded c, Bounded d, Bounded e,
+          Bounded f, Bounded g, Bounded h, Bounded i, Bounded j, Bounded k)
+        => Bounded (a,b,c,d,e,f,g,h,i,j,k)
+deriving instance (Bounded a, Bounded b, Bounded c, Bounded d, Bounded e,
+          Bounded f, Bounded g, Bounded h, Bounded i, Bounded j, Bounded k,
+          Bounded l)
+        => Bounded (a,b,c,d,e,f,g,h,i,j,k,l)
+deriving instance (Bounded a, Bounded b, Bounded c, Bounded d, Bounded e,
+          Bounded f, Bounded g, Bounded h, Bounded i, Bounded j, Bounded k,
+          Bounded l, Bounded m)
+        => Bounded (a,b,c,d,e,f,g,h,i,j,k,l,m)
+deriving instance (Bounded a, Bounded b, Bounded c, Bounded d, Bounded e,
+          Bounded f, Bounded g, Bounded h, Bounded i, Bounded j, Bounded k,
+          Bounded l, Bounded m, Bounded n)
+        => Bounded (a,b,c,d,e,f,g,h,i,j,k,l,m,n)
+deriving instance (Bounded a, Bounded b, Bounded c, Bounded d, Bounded e,
+          Bounded f, Bounded g, Bounded h, Bounded i, Bounded j, Bounded k,
+          Bounded l, Bounded m, Bounded n, Bounded o)
+        => Bounded (a,b,c,d,e,f,g,h,i,j,k,l,m,n,o)
 
 ------------------------------------------------------------------------
 -- Bool
 ------------------------------------------------------------------------
 
-instance Bounded Bool where
-  minBound = False
-  maxBound = True
-
+deriving instance Bounded Bool
 instance Enum Bool where
   succ False = True
   succ True  = errorWithoutStackTrace "Prelude.Enum.Bool.succ: bad argument"
@@ -286,10 +239,7 @@ instance Enum Bool where
 -- Ordering
 ------------------------------------------------------------------------
 
-instance Bounded Ordering where
-  minBound = LT
-  maxBound = GT
-
+deriving instance Bounded Ordering
 instance Enum Ordering where
   succ LT = EQ
   succ EQ = GT