Add instances for Data.Ord.Down
authorAdam Sandberg Eriksson <adam@sandbergericsson.se>
Tue, 25 Apr 2017 22:41:28 +0000 (18:41 -0400)
committerBen Gamari <ben@smart-cactus.org>
Tue, 25 Apr 2017 22:41:29 +0000 (18:41 -0400)
Namely `Num`, `Functor`, `Applicative`, `Monad`, `Semigroup` and
`Monoid` for `Data.Ord.Down` (#13097).

Reviewers: austin, hvr, bgamari, RyanGlScott

Reviewed By: bgamari, RyanGlScott

Subscribers: RyanGlScott, rwbarton, thomie

GHC Trac Issues: #13097

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

libraries/base/Data/Ord.hs
libraries/base/Data/Semigroup.hs
libraries/base/changelog.md
libraries/base/tests/T13097.hs [new file with mode: 0644]
libraries/base/tests/T13097.stdout [new file with mode: 0644]
libraries/base/tests/all.T

index 767d7b3..11d6967 100644 (file)
@@ -1,5 +1,6 @@
 {-# LANGUAGE Trustworthy #-}
 {-# LANGUAGE NoImplicitPrelude #-}
+{-# LANGUAGE GeneralizedNewtypeDeriving #-}
 
 -----------------------------------------------------------------------------
 -- |
@@ -25,6 +26,7 @@ module Data.Ord (
 import GHC.Base
 import GHC.Show
 import GHC.Read
+import GHC.Num
 
 -- | 
 -- > comparing p x y = compare (p x) (p y)
@@ -43,11 +45,29 @@ comparing p x y = compare (p x) (p y)
 -- This is particularly useful when sorting in generalised list comprehensions,
 -- as in: @then sortWith by 'Down' x@
 --
--- Provides 'Show' and 'Read' instances (/since: 4.7.0.0/).
---
 -- @since 4.6.0.0
-newtype Down a = Down a deriving (Eq, Show, Read)
+newtype Down a = Down a
+    deriving
+      ( Eq
+      , Show -- ^ @since 4.7.0.0
+      , Read -- ^ @since 4.7.0.0
+      , Num -- ^ @since 4.11.0.0
+      , Monoid -- ^ @since 4.11.0.0
+      )
 
 -- | @since 4.6.0.0
 instance Ord a => Ord (Down a) where
     compare (Down x) (Down y) = y `compare` x
+
+-- | @since 4.11.0.0
+instance Functor Down where
+    fmap = coerce
+
+-- | @since 4.11.0.0
+instance Applicative Down where
+    pure = Down
+    (<*>) = coerce
+
+-- | @since 4.11.0.0
+instance Monad Down where
+    Down a >>= k = k a
index e6bc314..ec68683 100644 (file)
@@ -83,6 +83,7 @@ import           Data.Monoid         (All (..), Any (..), Dual (..), Endo (..),
                                       Product (..), Sum (..))
 import           Data.Monoid         (Alt (..))
 import qualified Data.Monoid         as Monoid
+import           Data.Ord            (Down(..))
 import           Data.Void
 #ifndef mingw32_HOST_OS
 import           GHC.Event           (Event, Lifetime)
@@ -238,6 +239,11 @@ instance Semigroup Any where
   (<>) = coerce (||)
   stimes = stimesIdempotentMonoid
 
+-- | @since 4.11.0.0
+instance Semigroup a => Semigroup (Down a) where
+  Down a <> Down b = Down (a <> b)
+  stimes n (Down a) = Down (stimes n a)
+
 
 -- | @since 4.9.0.0
 instance Num a => Semigroup (Sum a) where
index e2e276a..69baab3 100644 (file)
@@ -5,6 +5,10 @@
 
   * Add `Alternative` instance for `ZipList` (#13520)
 
+  * Add instances `Num`, `Functor`, `Applicative`, `Monad`, `Semigroup`
+    and `Monoid` for `Data.Ord.Down` (#13097).
+
+
 ## 4.10.0.0 *April 2017*
   * Bundled with GHC *TBA*
 
diff --git a/libraries/base/tests/T13097.hs b/libraries/base/tests/T13097.hs
new file mode 100644 (file)
index 0000000..f51b7cf
--- /dev/null
@@ -0,0 +1,7 @@
+{-# LANGUAGE TypeApplications #-}
+import Data.Ord
+
+main :: IO ()
+main = do
+  print ((<) 10 20)
+  print ((<) @(Down _) 10 20)
diff --git a/libraries/base/tests/T13097.stdout b/libraries/base/tests/T13097.stdout
new file mode 100644 (file)
index 0000000..1cc8b5e
--- /dev/null
@@ -0,0 +1,2 @@
+True
+False
index 33055f3..4bd8084 100644 (file)
@@ -213,3 +213,4 @@ test('T13191',
       compile_and_run,
       ['-O'])
 test('T13525', when(opsys('mingw32'), skip), compile_and_run, [''])
+test('T13097', normal, compile_and_run, [''])