ffunctor 1.1.100 → 1.2.0
raw patch · 2 files changed
+69/−5 lines, 2 filesdep ~basePVP ok
version bump matches the API change (PVP)
Dependency ranges changed: base
API changes (from Hackage documentation)
+ Data.FFunctor: instance (Data.FFunctor.FFunctor f, Data.FFunctor.FFunctor g) => Data.FFunctor.FFunctor (Data.Functor.Product.Product f g)
+ Data.FFunctor: instance (Data.FFunctor.FFunctor f, Data.FFunctor.FFunctor g) => Data.FFunctor.FFunctor (Data.Functor.Sum.Sum f g)
+ Data.FFunctor: instance (Data.FFunctor.FFunctor f, Data.FFunctor.FFunctor g) => Data.FFunctor.FFunctor (f GHC.Generics.:*: g)
+ Data.FFunctor: instance (Data.FFunctor.FFunctor f, Data.FFunctor.FFunctor g) => Data.FFunctor.FFunctor (f GHC.Generics.:+: g)
+ Data.FFunctor: instance (GHC.Base.Functor f, Data.FFunctor.FFunctor g) => Data.FFunctor.FFunctor (Data.Functor.Compose.Compose f g)
+ Data.FFunctor: instance (GHC.Base.Functor f, Data.FFunctor.FFunctor g) => Data.FFunctor.FFunctor (f GHC.Generics.:.: g)
+ Data.FFunctor: instance Data.FFunctor.FFunctor (Data.Functor.Const.Const c)
+ Data.FFunctor: instance Data.FFunctor.FFunctor (GHC.Generics.K1 i c)
+ Data.FFunctor: instance Data.FFunctor.FFunctor GHC.Generics.U1
+ Data.FFunctor: instance Data.FFunctor.FFunctor GHC.Generics.V1
+ Data.FFunctor: instance Data.FFunctor.FFunctor f => Data.FFunctor.FFunctor (GHC.Generics.M1 i c f)
+ Data.FFunctor: instance Data.FFunctor.FFunctor f => Data.FFunctor.FFunctor (GHC.Generics.Rec1 f)
- Data.FFunctor: ffmap :: (FFunctor f, Functor m, Functor n) => (forall a. m a -> n a) -> f m -> f n
+ Data.FFunctor: ffmap :: (FFunctor f, Generic1 f, FFunctor (Rep1 f), Functor m, Functor n) => (forall a. m a -> n a) -> f m -> f n
Files
- ffunctor.cabal +1/−1
- library/Data/FFunctor.hs +68/−4
ffunctor.cabal view
@@ -1,6 +1,6 @@ cabal-version: 2.2 name: ffunctor-version: 1.1.100+version: 1.2.0 synopsis: FFunctor typeclass license: BSD-3-Clause license-file: LICENSE
library/Data/FFunctor.hs view
@@ -1,6 +1,9 @@-{-# LANGUAGE CPP #-}-{-# LANGUAGE KindSignatures #-}-{-# LANGUAGE Rank2Types #-}+{-# LANGUAGE CPP #-}+{-# LANGUAGE KindSignatures #-}+{-# LANGUAGE Rank2Types #-}+{-# LANGUAGE DefaultSignatures #-}+{-# LANGUAGE EmptyCase #-}+{-# LANGUAGE FlexibleContexts #-} -- | Functor of Functors module Data.FFunctor where@@ -9,11 +12,20 @@ import Control.Monad.Trans.Class (MonadTrans, lift) #endif import Control.Monad.IO.Class (MonadIO, liftIO)+import qualified GHC.Generics as Generics+import Data.Functor.Compose+import Data.Functor.Product+import Data.Functor.Sum+import Data.Functor.Const+import Data.Coerce class FFunctor (f :: (* -> *) -> *) where---ffmap :: (Functor m, Functor n) => (m ~> n) -> f m -> f n ffmap :: (Functor m, Functor n) => (forall a . (m a -> n a)) -> f m -> f n + default ffmap :: (Generics.Generic1 f, FFunctor (Generics.Rep1 f), Functor m, Functor n) => (forall a . (m a -> n a)) -> f m -> f n+ ffmap f = Generics.to1 . ffmap f . Generics.from1+ {-# INLINE ffmap #-}+ -- | Lifts an IO impl of a record of functions into a more general MonadIO impl luftIO :: FFunctor f => MonadIO m => f IO -> f m luftIO = ffmap liftIO@@ -25,3 +37,55 @@ luft :: FFunctor f => Monad m => MonadTrans t => Functor (t m) => f m -> f (t m) luft = ffmap lift #endif++instance FFunctor Generics.V1 where+ ffmap _ x = case x of {}+ {-# INLINE ffmap #-}++instance FFunctor Generics.U1 where+ ffmap _ = coerce+ {-# INLINE ffmap #-}++instance FFunctor f => FFunctor (Generics.Rec1 f) where+ ffmap f (Generics.Rec1 a) = Generics.Rec1 (ffmap f a)+ {-# INLINE ffmap #-}++instance FFunctor (Generics.K1 i c) where+ ffmap _ = coerce+ {-# INLINE ffmap #-}++instance FFunctor f => FFunctor (Generics.M1 i c f) where+ ffmap f (Generics.M1 a) = Generics.M1 (ffmap f a)+ {-# INLINE ffmap #-}++instance (FFunctor f, FFunctor g) => FFunctor ((Generics.:+:) f g) where+ ffmap f (Generics.L1 a) = Generics.L1 (ffmap f a)+ ffmap f (Generics.R1 a) = Generics.R1 (ffmap f a)+ {-# INLINE ffmap #-}++instance (FFunctor f, FFunctor g) => FFunctor ((Generics.:*:) f g) where+ ffmap f (a Generics.:*: b) = ffmap f a Generics.:*: ffmap f b+ {-# INLINE ffmap #-}++-- (f :.: g) a = f (g a), f must be (regular) Functor+instance (Functor f, FFunctor g) => FFunctor ((Generics.:.:) f g) where+ ffmap f (Generics.Comp1 a) = Generics.Comp1 (fmap (ffmap f) a)+ {-# INLINE ffmap #-}++instance (FFunctor f, FFunctor g) => FFunctor (Sum f g) where+ ffmap f (InL a) = InL (ffmap f a)+ ffmap f (InR a) = InR (ffmap f a)+ {-# INLINE ffmap #-}++instance (FFunctor f, FFunctor g) => FFunctor (Product f g) where+ ffmap f (Pair a b) = Pair (ffmap f a) (ffmap f b)+ {-# INLINE ffmap #-}++instance FFunctor (Const c) where+ ffmap _ = coerce+ {-# INLINE ffmap #-}++-- Compose f g a = f (g a), f must be (regular) Functor+instance (Functor f, FFunctor g) => FFunctor (Compose f g) where+ ffmap f (Compose a) = Compose (fmap (ffmap f) a)+ {-# INLINE ffmap #-}