From 267a96484d566d87740395f16b6b2b63e02747a5 Mon Sep 17 00:00:00 2001 From: Langston Barrett Date: Sat, 1 Feb 2025 10:25:53 -0500 Subject: [PATCH 1/6] `{Functor,Foldable,Traversable}FC` instances for `TypeAp` --- src/Data/Parameterized/TraversableFC.hs | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/src/Data/Parameterized/TraversableFC.hs b/src/Data/Parameterized/TraversableFC.hs index e11361a..31c06b1 100644 --- a/src/Data/Parameterized/TraversableFC.hs +++ b/src/Data/Parameterized/TraversableFC.hs @@ -55,6 +55,9 @@ class FunctorFC (t :: (k -> Type) -> l -> Type) where fmapFC :: forall f g. (forall x. f x -> g x) -> (forall x. t f x -> t g x) +instance FunctorFC TypeAp where + fmapFC f (TypeAp a) = TypeAp (f a) + -- | A parameterized class for types which can be shown, when given -- functions to show parameterized subterms. class ShowFC (t :: (k -> Type) -> l -> Type) where @@ -161,6 +164,9 @@ anyFC p = getAny #. foldMapFC (Any #. p) lengthFC :: FoldableFC t => t f x -> Int lengthFC = foldrFC (const (+1)) 0 +instance FoldableFC TypeAp where + foldMapFC toMonoid (TypeAp x) = toMonoid x + ------------------------------------------------------------------------ -- TraversableF @@ -206,3 +212,6 @@ forFC :: t f x -> (forall y. f y -> m (g y)) -> m (t g x) forFC v f = traverseFC f v {-# INLINE forFC #-} + +instance TraversableFC TypeAp where + traverseFC f (TypeAp x) = TypeAp <$> f x From bbd308f290347299a4683bc7e246a529071c4a10 Mon Sep 17 00:00:00 2001 From: Langston Barrett Date: Sat, 1 Feb 2025 10:32:05 -0500 Subject: [PATCH 2/6] `{Functor,Foldable,Traversable}FC` instances for `Alt`, `Ap` --- src/Data/Parameterized/TraversableFC.hs | 18 ++++++++++++++++++ 1 file changed, 18 insertions(+) diff --git a/src/Data/Parameterized/TraversableFC.hs b/src/Data/Parameterized/TraversableFC.hs index 31c06b1..3af541e 100644 --- a/src/Data/Parameterized/TraversableFC.hs +++ b/src/Data/Parameterized/TraversableFC.hs @@ -55,6 +55,12 @@ class FunctorFC (t :: (k -> Type) -> l -> Type) where fmapFC :: forall f g. (forall x. f x -> g x) -> (forall x. t f x -> t g x) +instance FunctorFC Alt where + fmapFC f (Alt a) = Alt (f a) + +instance FunctorFC Ap where + fmapFC f (Ap a) = Ap (f a) + instance FunctorFC TypeAp where fmapFC f (TypeAp a) = TypeAp (f a) @@ -164,6 +170,12 @@ anyFC p = getAny #. foldMapFC (Any #. p) lengthFC :: FoldableFC t => t f x -> Int lengthFC = foldrFC (const (+1)) 0 +instance FoldableFC Alt where + foldMapFC toMonoid (Alt x) = toMonoid x + +instance FoldableFC Ap where + foldMapFC toMonoid (Ap x) = toMonoid x + instance FoldableFC TypeAp where foldMapFC toMonoid (TypeAp x) = toMonoid x @@ -213,5 +225,11 @@ forFC :: forFC v f = traverseFC f v {-# INLINE forFC #-} +instance TraversableFC Alt where + traverseFC f (Alt x) = Alt <$> f x + +instance TraversableFC Ap where + traverseFC f (Ap x) = Ap <$> f x + instance TraversableFC TypeAp where traverseFC f (TypeAp x) = TypeAp <$> f x From f6ececa5a735904c29b8a783b49a9fa49bdf39d4 Mon Sep 17 00:00:00 2001 From: Langston Barrett Date: Sat, 1 Feb 2025 10:40:45 -0500 Subject: [PATCH 3/6] `{Functor,Foldable,Traversable}F` instances for `Proxy` --- src/Data/Parameterized/TraversableF.hs | 13 +++++++++++++ 1 file changed, 13 insertions(+) diff --git a/src/Data/Parameterized/TraversableF.hs b/src/Data/Parameterized/TraversableF.hs index d8d0f37..711e045 100644 --- a/src/Data/Parameterized/TraversableF.hs +++ b/src/Data/Parameterized/TraversableF.hs @@ -37,6 +37,7 @@ import Data.Coerce import Data.Functor.Compose (Compose(..)) import Data.Kind import Data.Monoid +import Data.Proxy (Proxy(Proxy)) import GHC.Exts (build) import Data.Parameterized.TraversableFC @@ -48,6 +49,10 @@ class FunctorF m where instance FunctorF (Const x) where fmapF _ = coerce +instance FunctorF Proxy where + fmapF _ = coerce + {-# INLINE fmapF #-} + ------------------------------------------------------------------------ -- FoldableF @@ -125,6 +130,10 @@ lengthF = foldrF (const (+1)) 0 instance FoldableF (Const x) where foldMapF _ _ = mempty +instance FoldableF Proxy where + foldMapF _ _ = mempty + {-# INLINE foldMapF #-} + ------------------------------------------------------------------------ -- TraversableF @@ -137,6 +146,10 @@ class (FunctorF t, FoldableF t) => TraversableF t where instance TraversableF (Const x) where traverseF _ (Const x) = pure (Const x) +instance TraversableF Proxy where + traverseF _ _ = pure Proxy + {-# INLINE traverseF #-} + -- | Flipped 'traverseF' forF :: (TraversableF t, Applicative m) => t e -> (forall s . e s -> m (f s)) -> m (t f) forF f x = traverseF x f From 56c59573161bb57bc1710aa04944408cdb8fdf34 Mon Sep 17 00:00:00 2001 From: Langston Barrett Date: Sat, 1 Feb 2025 10:47:28 -0500 Subject: [PATCH 4/6] `{Functor,Foldable,Traversable}F` instances for `Product`, `Sum` --- src/Data/Parameterized/TraversableF.hs | 25 ++++++++++++++++++++++++- 1 file changed, 24 insertions(+), 1 deletion(-) diff --git a/src/Data/Parameterized/TraversableF.hs b/src/Data/Parameterized/TraversableF.hs index 711e045..52eb08b 100644 --- a/src/Data/Parameterized/TraversableF.hs +++ b/src/Data/Parameterized/TraversableF.hs @@ -35,8 +35,10 @@ import Control.Applicative import Control.Monad.Identity import Data.Coerce import Data.Functor.Compose (Compose(..)) +import Data.Functor.Product (Product(Pair)) +import Data.Functor.Sum (Sum(InL, InR)) import Data.Kind -import Data.Monoid +import Data.Monoid hiding (Product, Sum) import Data.Proxy (Proxy(Proxy)) import GHC.Exts (build) @@ -49,10 +51,17 @@ class FunctorF m where instance FunctorF (Const x) where fmapF _ = coerce +instance (FunctorF f, FunctorF g) => FunctorF (Product f g) where + fmapF f (Pair x y) = Pair (fmapF f x) (fmapF f y) + instance FunctorF Proxy where fmapF _ = coerce {-# INLINE fmapF #-} +instance (FunctorF f, FunctorF g) => FunctorF (Sum f g) where + fmapF f (InL x) = InL (fmapF f x) + fmapF f (InR x) = InR (fmapF f x) + ------------------------------------------------------------------------ -- FoldableF @@ -130,10 +139,17 @@ lengthF = foldrF (const (+1)) 0 instance FoldableF (Const x) where foldMapF _ _ = mempty +instance (FoldableF f, FoldableF g) => FoldableF (Product f g) where + foldMapF f (Pair x y) = foldMapF f x <> foldMapF f y + instance FoldableF Proxy where foldMapF _ _ = mempty {-# INLINE foldMapF #-} +instance (FoldableF f, FoldableF g) => FoldableF (Sum f g) where + foldMapF f (InL x) = foldMapF f x + foldMapF f (InR y) = foldMapF f y + ------------------------------------------------------------------------ -- TraversableF @@ -146,10 +162,17 @@ class (FunctorF t, FoldableF t) => TraversableF t where instance TraversableF (Const x) where traverseF _ (Const x) = pure (Const x) +instance (TraversableF f, TraversableF g) => TraversableF (Product f g) where + traverseF f (Pair x y) = Pair <$> traverseF f x <*> traverseF f y + instance TraversableF Proxy where traverseF _ _ = pure Proxy {-# INLINE traverseF #-} +instance (TraversableF f, TraversableF g) => TraversableF (Sum f g) where + traverseF f (InL x) = InL <$> traverseF f x + traverseF f (InR y) = InR <$> traverseF f y + -- | Flipped 'traverseF' forF :: (TraversableF t, Applicative m) => t e -> (forall s . e s -> m (f s)) -> m (t f) forF f x = traverseF x f From 9897424188e353dfd9cb27d90abd5589e314543a Mon Sep 17 00:00:00 2001 From: Langston Barrett Date: Tue, 4 Feb 2025 13:04:42 -0500 Subject: [PATCH 5/6] changelog: Note new instances for `base` and `TypeAp` --- Changelog.md | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/Changelog.md b/Changelog.md index f91f73e..530d487 100644 --- a/Changelog.md +++ b/Changelog.md @@ -1,5 +1,14 @@ # Changelog for the `parameterized-utils` package +## next + + * New instances for types from `base`: + + - `{Functor,Foldable,Traversable}F` instances for `Product`, `Proxy`, `Sum` + - `{Functor,Foldable,Traversable}FC` instances for `Alt`, `Ap` + + * `{Functor,Foldable,Traversable}FC` instances for `TypeAp` + ## 2.1.9.0 -- *2024 Sep 19* * Add support for GHC 9.10. From da77455d8b17e787ad821991fa8c7076479d4a24 Mon Sep 17 00:00:00 2001 From: Langston Barrett Date: Tue, 4 Feb 2025 13:05:09 -0500 Subject: [PATCH 6/6] Bump minimum version on `base` for `Ap` instance --- parameterized-utils.cabal | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/parameterized-utils.cabal b/parameterized-utils.cabal index fffcaf5..558cae3 100644 --- a/parameterized-utils.cabal +++ b/parameterized-utils.cabal @@ -50,7 +50,7 @@ common bldflags library import: bldflags - build-depends: base >= 4.10 && < 5 + build-depends: base >= 4.12 && < 5 , base-orphans >=0.8.2 && <0.10 , th-abstraction >=0.4.2 && <0.8 , constraints >=0.10 && <0.15