summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorArmando Ramirez <armando.m.ramirez@gmail.com>2022-09-14 18:17:12 -0700
committerMarge Bot <ben+marge-bot@smart-cactus.org>2023-03-23 09:19:32 -0400
commit8c98deba9a0b8136f858ecc5d7a6948dcf60820e (patch)
treef4770750900788dda4abb0e43271cdf715588129
parent30d45e971d94b3c28296a3f20f94275f38bc89d1 (diff)
downloadhaskell-8c98deba9a0b8136f858ecc5d7a6948dcf60820e.tar.gz
Optimized Foldable methods for Data.Functor.Compose
Explicitly define length, elem, etc. in Foldable instance for Data.Functor.Compose Implementation of https://github.com/haskell/core-libraries-committee/issues/57
-rw-r--r--libraries/base/Data/Functor/Compose.hs7
1 files changed, 7 insertions, 0 deletions
diff --git a/libraries/base/Data/Functor/Compose.hs b/libraries/base/Data/Functor/Compose.hs
index 53bb53c234..b030e3511e 100644
--- a/libraries/base/Data/Functor/Compose.hs
+++ b/libraries/base/Data/Functor/Compose.hs
@@ -31,6 +31,8 @@ import Data.Functor.Classes
import Control.Applicative
import Data.Coerce (coerce)
import Data.Data (Data)
+import Data.Foldable (foldMap')
+import Data.Monoid (Sum(..), Any(..), Product(..))
import Data.Type.Equality (TestEquality(..), (:~:)(..))
import GHC.Generics (Generic, Generic1)
import Text.Read (Read(..), ReadPrec, readListDefault, readListPrecDefault)
@@ -113,6 +115,11 @@ instance (Functor f, Functor g) => Functor (Compose f g) where
instance (Foldable f, Foldable g) => Foldable (Compose f g) where
foldMap f (Compose t) = foldMap (foldMap f) t
+ length (Compose t) = getSum (foldMap' (Sum . length) t)
+ elem x (Compose t) = getAny (foldMap' (Any . elem x) t)
+ sum (Compose t) = getSum (foldMap' (Sum . sum) t)
+ product (Compose t) = getProduct (foldMap' (Product . product) t)
+
-- | @since 4.9.0.0
instance (Traversable f, Traversable g) => Traversable (Compose f g) where
traverse f (Compose t) = Compose <$> traverse (traverse f) t