summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAdam Sandberg Eriksson <adam@sandbergericsson.se>2017-04-25 18:41:28 -0400
committerBen Gamari <ben@smart-cactus.org>2017-04-25 18:41:29 -0400
commit47be6444d35783eea7dc3ab8b2f11626777cdbd8 (patch)
treee3902b787e2407a91a32b9a50e8267586d6f7622
parent244602697c30e03ba63076941e4742ceeb78dd7c (diff)
downloadhaskell-47be6444d35783eea7dc3ab8b2f11626777cdbd8.tar.gz
Add instances for Data.Ord.Down
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
-rw-r--r--libraries/base/Data/Ord.hs26
-rw-r--r--libraries/base/Data/Semigroup.hs6
-rw-r--r--libraries/base/changelog.md4
-rw-r--r--libraries/base/tests/T13097.hs7
-rw-r--r--libraries/base/tests/T13097.stdout2
-rw-r--r--libraries/base/tests/all.T1
6 files changed, 43 insertions, 3 deletions
diff --git a/libraries/base/Data/Ord.hs b/libraries/base/Data/Ord.hs
index 767d7b379f..11d6967134 100644
--- a/libraries/base/Data/Ord.hs
+++ b/libraries/base/Data/Ord.hs
@@ -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
diff --git a/libraries/base/Data/Semigroup.hs b/libraries/base/Data/Semigroup.hs
index e6bc3140b4..ec68683799 100644
--- a/libraries/base/Data/Semigroup.hs
+++ b/libraries/base/Data/Semigroup.hs
@@ -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
diff --git a/libraries/base/changelog.md b/libraries/base/changelog.md
index e2e276a4c9..69baab381b 100644
--- a/libraries/base/changelog.md
+++ b/libraries/base/changelog.md
@@ -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
index 0000000000..f51b7cf7ab
--- /dev/null
+++ b/libraries/base/tests/T13097.hs
@@ -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
index 0000000000..1cc8b5e10d
--- /dev/null
+++ b/libraries/base/tests/T13097.stdout
@@ -0,0 +1,2 @@
+True
+False
diff --git a/libraries/base/tests/all.T b/libraries/base/tests/all.T
index 33055f3bdd..4bd8084220 100644
--- a/libraries/base/tests/all.T
+++ b/libraries/base/tests/all.T
@@ -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, [''])