packages feed

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 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 #-}