packages feed

invariant 0.2.2 → 0.3

raw patch · 3 files changed

+171/−38 lines, 3 filesdep +StateVardep ~basedep ~bifunctorsdep ~contravariantPVP ok

version bump matches the API change (PVP)

Dependencies added: StateVar

Dependency ranges changed: base, bifunctors, contravariant, profunctors, template-haskell

API changes (from Hackage documentation)

- Data.Functor.Invariant: instance (Data.Functor.Invariant.Invariant2 p, Data.Functor.Invariant.Invariant g) => Data.Functor.Invariant.Invariant (Data.Bifunctor.Biff.Biff p f g a)
- Data.Functor.Invariant: instance Control.Arrow.Arrow arr => Data.Functor.Invariant.Invariant (Data.Profunctor.WrappedArrow arr a)
- Data.Functor.Invariant: instance Control.Arrow.Arrow arr => Data.Functor.Invariant.Invariant2 (Data.Profunctor.WrappedArrow arr)
- Data.Functor.Invariant: instance Data.Functor.Invariant.Invariant (Data.Bifunctor.Clown.Clown f a)
- Data.Functor.Invariant: instance Data.Functor.Invariant.Invariant (Data.Profunctor.Costar f a)
- Data.Functor.Invariant: instance Data.Functor.Invariant.Invariant (Data.Profunctor.Forget r a)
- Data.Functor.Invariant: instance Data.Functor.Invariant.Invariant f => Data.Functor.Invariant.Invariant (Data.Profunctor.Star f a)
- Data.Functor.Invariant: instance Data.Functor.Invariant.Invariant f => Data.Functor.Invariant.Invariant2 (Data.Profunctor.Costar f)
- Data.Functor.Invariant: instance Data.Functor.Invariant.Invariant f => Data.Functor.Invariant.Invariant2 (Data.Profunctor.Star f)
- Data.Functor.Invariant: instance Data.Functor.Invariant.Invariant g => Data.Functor.Invariant.Invariant (Data.Bifunctor.Joker.Joker g a)
- Data.Functor.Invariant: instance Data.Functor.Invariant.Invariant2 (Data.Profunctor.Forget r)
- Data.Functor.Invariant: instance Data.Functor.Invariant.Invariant2 (Data.Profunctor.Tambara.Copastro p)
- Data.Functor.Invariant: instance Data.Functor.Invariant.Invariant2 (Data.Profunctor.Tambara.Pastro p)
- Data.Functor.Invariant: instance Data.Functor.Invariant.Invariant2 p => Data.Functor.Invariant.Invariant (Data.Profunctor.Codensity.Codensity p a)
- Data.Functor.Invariant: instance Data.Functor.Invariant.Invariant2 p => Data.Functor.Invariant.Invariant (Data.Profunctor.Tambara.Cotambara p a)
- Data.Functor.Invariant: instance Data.Functor.Invariant.Invariant2 p => Data.Functor.Invariant.Invariant (Data.Profunctor.Tambara.Tambara p a)
- Data.Functor.Invariant: instance Data.Functor.Invariant.Invariant2 p => Data.Functor.Invariant.Invariant2 (Data.Profunctor.Codensity.Codensity p)
- Data.Functor.Invariant: instance Data.Functor.Invariant.Invariant2 p => Data.Functor.Invariant.Invariant2 (Data.Profunctor.Tambara.Cotambara p)
- Data.Functor.Invariant: instance Data.Functor.Invariant.Invariant2 p => Data.Functor.Invariant.Invariant2 (Data.Profunctor.Tambara.Tambara p)
- Data.Functor.Invariant: instance Data.Profunctor.Choice p => Data.Profunctor.Choice (Data.Functor.Invariant.WrappedProfunctor p)
- Data.Functor.Invariant: instance Data.Profunctor.Cochoice p => Data.Profunctor.Cochoice (Data.Functor.Invariant.WrappedProfunctor p)
- Data.Functor.Invariant: instance Data.Profunctor.Costrong p => Data.Profunctor.Costrong (Data.Functor.Invariant.WrappedProfunctor p)
- Data.Functor.Invariant: instance Data.Profunctor.Strong p => Data.Profunctor.Strong (Data.Functor.Invariant.WrappedProfunctor p)
+ Data.Functor.Invariant: instance (Data.Functor.Invariant.Invariant2 p, Data.Functor.Invariant.Invariant2 q) => Data.Functor.Invariant.Invariant2 (Data.Bifunctor.Sum.Sum p q)
+ Data.Functor.Invariant: instance Control.Arrow.Arrow arr => Data.Functor.Invariant.Invariant (Data.Profunctor.Types.WrappedArrow arr a)
+ Data.Functor.Invariant: instance Control.Arrow.Arrow arr => Data.Functor.Invariant.Invariant2 (Data.Profunctor.Types.WrappedArrow arr)
+ Data.Functor.Invariant: instance Data.Functor.Invariant.Invariant (Data.Profunctor.Choice.CotambaraSum p a)
+ Data.Functor.Invariant: instance Data.Functor.Invariant.Invariant (Data.Profunctor.Strong.Cotambara p a)
+ Data.Functor.Invariant: instance Data.Functor.Invariant.Invariant (Data.Profunctor.Types.Costar f a)
+ Data.Functor.Invariant: instance Data.Functor.Invariant.Invariant (Data.Profunctor.Types.Forget r a)
+ Data.Functor.Invariant: instance Data.Functor.Invariant.Invariant Data.StateVar.SettableStateVar
+ Data.Functor.Invariant: instance Data.Functor.Invariant.Invariant Data.StateVar.StateVar
+ Data.Functor.Invariant: instance Data.Functor.Invariant.Invariant f => Data.Functor.Invariant.Invariant (Data.Profunctor.Types.Star f a)
+ Data.Functor.Invariant: instance Data.Functor.Invariant.Invariant f => Data.Functor.Invariant.Invariant2 (Data.Profunctor.Types.Costar f)
+ Data.Functor.Invariant: instance Data.Functor.Invariant.Invariant f => Data.Functor.Invariant.Invariant2 (Data.Profunctor.Types.Star f)
+ Data.Functor.Invariant: instance Data.Functor.Invariant.Invariant2 (Data.Profunctor.Choice.CopastroSum p)
+ Data.Functor.Invariant: instance Data.Functor.Invariant.Invariant2 (Data.Profunctor.Choice.CotambaraSum p)
+ Data.Functor.Invariant: instance Data.Functor.Invariant.Invariant2 (Data.Profunctor.Choice.PastroSum p)
+ Data.Functor.Invariant: instance Data.Functor.Invariant.Invariant2 (Data.Profunctor.Mapping.FreeMapping p)
+ Data.Functor.Invariant: instance Data.Functor.Invariant.Invariant2 (Data.Profunctor.Strong.Cotambara p)
+ Data.Functor.Invariant: instance Data.Functor.Invariant.Invariant2 (Data.Profunctor.Strong.Pastro p)
+ Data.Functor.Invariant: instance Data.Functor.Invariant.Invariant2 (Data.Profunctor.Traversing.FreeTraversing p)
+ Data.Functor.Invariant: instance Data.Functor.Invariant.Invariant2 (Data.Profunctor.Types.Forget r)
+ Data.Functor.Invariant: instance Data.Functor.Invariant.Invariant2 p => Data.Functor.Invariant.Invariant (Data.Bifunctor.Fix.Fix p)
+ Data.Functor.Invariant: instance Data.Functor.Invariant.Invariant2 p => Data.Functor.Invariant.Invariant (Data.Profunctor.Choice.TambaraSum p a)
+ Data.Functor.Invariant: instance Data.Functor.Invariant.Invariant2 p => Data.Functor.Invariant.Invariant (Data.Profunctor.Ran.Codensity p a)
+ Data.Functor.Invariant: instance Data.Functor.Invariant.Invariant2 p => Data.Functor.Invariant.Invariant (Data.Profunctor.Rep.Coprep p)
+ Data.Functor.Invariant: instance Data.Functor.Invariant.Invariant2 p => Data.Functor.Invariant.Invariant (Data.Profunctor.Rep.Prep p)
+ Data.Functor.Invariant: instance Data.Functor.Invariant.Invariant2 p => Data.Functor.Invariant.Invariant (Data.Profunctor.Strong.Tambara p a)
+ Data.Functor.Invariant: instance Data.Functor.Invariant.Invariant2 p => Data.Functor.Invariant.Invariant2 (Data.Profunctor.Choice.TambaraSum p)
+ Data.Functor.Invariant: instance Data.Functor.Invariant.Invariant2 p => Data.Functor.Invariant.Invariant2 (Data.Profunctor.Mapping.CofreeMapping p)
+ Data.Functor.Invariant: instance Data.Functor.Invariant.Invariant2 p => Data.Functor.Invariant.Invariant2 (Data.Profunctor.Ran.Codensity p)
+ Data.Functor.Invariant: instance Data.Functor.Invariant.Invariant2 p => Data.Functor.Invariant.Invariant2 (Data.Profunctor.Strong.Tambara p)
+ Data.Functor.Invariant: instance Data.Functor.Invariant.Invariant2 p => Data.Functor.Invariant.Invariant2 (Data.Profunctor.Traversing.CofreeTraversing p)
+ Data.Functor.Invariant: instance Data.Profunctor.Choice.Choice p => Data.Profunctor.Choice.Choice (Data.Functor.Invariant.WrappedProfunctor p)
+ Data.Functor.Invariant: instance Data.Profunctor.Choice.Cochoice p => Data.Profunctor.Choice.Cochoice (Data.Functor.Invariant.WrappedProfunctor p)
+ Data.Functor.Invariant: instance Data.Profunctor.Mapping.Mapping p => Data.Profunctor.Mapping.Mapping (Data.Functor.Invariant.WrappedProfunctor p)
+ Data.Functor.Invariant: instance Data.Profunctor.Monad.ProfunctorComonad Data.Functor.Invariant.WrappedProfunctor
+ Data.Functor.Invariant: instance Data.Profunctor.Monad.ProfunctorFunctor Data.Functor.Invariant.WrappedProfunctor
+ Data.Functor.Invariant: instance Data.Profunctor.Monad.ProfunctorMonad Data.Functor.Invariant.WrappedProfunctor
+ Data.Functor.Invariant: instance Data.Profunctor.Strong.Costrong p => Data.Profunctor.Strong.Costrong (Data.Functor.Invariant.WrappedProfunctor p)
+ Data.Functor.Invariant: instance Data.Profunctor.Strong.Strong p => Data.Profunctor.Strong.Strong (Data.Functor.Invariant.WrappedProfunctor p)
+ Data.Functor.Invariant: instance Data.Profunctor.Traversing.Traversing p => Data.Profunctor.Traversing.Traversing (Data.Functor.Invariant.WrappedProfunctor p)
+ Data.Functor.Invariant: instance forall (k :: BOX) (f :: k -> *) (a :: k). Data.Functor.Invariant.Invariant (Data.Bifunctor.Clown.Clown f a)
+ Data.Functor.Invariant: instance forall (k :: BOX) (g :: * -> *) (a :: k). Data.Functor.Invariant.Invariant g => Data.Functor.Invariant.Invariant (Data.Bifunctor.Joker.Joker g a)
+ Data.Functor.Invariant: instance forall (k :: BOX) (p :: * -> * -> *) (f :: k -> *) (g :: * -> *) (a :: k). (Data.Functor.Invariant.Invariant2 p, Data.Functor.Invariant.Invariant g) => Data.Functor.Invariant.Invariant (Data.Bifunctor.Biff.Biff p f g a)
- Data.Functor.Invariant: WrapBifunctor :: p a b -> WrappedBifunctor a b
+ Data.Functor.Invariant: WrapBifunctor :: p a b -> WrappedBifunctor
- Data.Functor.Invariant: [unwrapBifunctor] :: WrappedBifunctor a b -> p a b
+ Data.Functor.Invariant: [unwrapBifunctor] :: WrappedBifunctor -> p a b
- Data.Functor.Invariant: newtype WrappedBifunctor (p :: * -> * -> *) a b :: (* -> * -> *) -> * -> * -> *
+ Data.Functor.Invariant: newtype WrappedBifunctor (p :: k -> k1 -> *) (a :: k) (b :: k1) :: (k -> k1 -> *) -> k -> k1 -> *

Files

CHANGELOG.md view
@@ -1,3 +1,13 @@+# 0.3+* Require `bifunctors-5.2` and `profunctors-5.2`. Add `Invariant(2)` instances+  for newly introduced datatypes from those packages.+* Add `ProfunctorFunctor`, `ProfunctorMonad`, `ProfunctorComonad`, `Mapping`,+  and `Traversing` instances for `WrappedProfunctor`+* Add `StateVar` as a dependency. Add `Invariant` instances for `StateVar` and+  `SettableStateVar`.+* Add `Invariant` instances for `URec` (added to `GHC.Generics` in+  `base-4.9.0.0`)+ # 0.2.2 * Add `genericInvmap` function (and make it the default implementation of   `invmap` for `Invariant` instances) on GHC 7.2 or later
invariant.cabal view
@@ -1,5 +1,5 @@ name:                invariant-version:             0.2.2+version:             0.3 synopsis:            Haskell 98 invariant functors description:         Haskell 98 invariant functors category:            Control, Data@@ -12,6 +12,12 @@                      Ryan Scott <ryan.gl.scott@gmail.com> build-type:          Simple cabal-version:       >= 1.9.2+tested-with:         GHC == 7.0.4+                   , GHC == 7.2.2+                   , GHC == 7.4.2+                   , GHC == 7.6.3+                   , GHC == 7.8.4+                   , GHC == 7.10.3 extra-source-files:  CHANGELOG.md, README.md  source-repository head@@ -26,21 +32,22 @@   hs-source-dirs:      src   build-depends:       array                >= 0.3    && < 0.6                      , base                 >= 4      && < 5-                     , bifunctors           >= 5      && < 6+                     , bifunctors           >= 5.2    && < 6                      , containers           >= 0.1    && < 0.6-                     , contravariant        >= 0.1.2  && < 2+                     , contravariant        >= 0.5    && < 2                      , ghc-prim-                     , profunctors          >= 5      && < 6+                     , profunctors          >= 5.2    && < 6                      , semigroups           >= 0.16.2 && < 1+                     , StateVar             >= 1.1    && < 2                      , stm                  >= 2.2    && < 3                      , tagged               >= 0.7.3  && < 1                      , template-haskell     >= 2.4    && < 2.12-                     , transformers         >= 0.2    && < 0.5+                     , transformers         >= 0.2    && < 0.6                      , transformers-compat  >= 0.3    && < 1                      , unordered-containers >= 0.2.4  && < 0.3   ghc-options:         -Wall -test-suite qc-tests+test-suite spec   type:                exitcode-stdio-1.0   hs-source-dirs:      test   main-is:             Spec.hs
src/Data/Functor/Invariant.hs view
@@ -6,6 +6,8 @@ #if GHC_GENERICS_OK {-# LANGUAGE DefaultSignatures #-} {-# LANGUAGE FlexibleContexts #-}+{-# LANGUAGE FlexibleInstances #-}+{-# LANGUAGE TypeFamilies #-} #endif  #if __GLASGOW_HASKELL__ >= 706@@ -48,7 +50,7 @@  -- base import qualified Control.Category as Cat-import           Control.Arrow+import           Control.Arrow hiding (first) import           Control.Applicative as App import           Control.Exception (Handler(..)) import           Control.Monad (MonadPlus(..), liftM)@@ -77,13 +79,15 @@ import           Data.Array (Array)  -- bifunctors-import           Data.Bifunctor hiding (first)+import           Data.Bifunctor import           Data.Bifunctor.Biff import           Data.Bifunctor.Clown+import           Data.Bifunctor.Fix import           Data.Bifunctor.Flip import           Data.Bifunctor.Join import           Data.Bifunctor.Joker-import qualified Data.Bifunctor.Product as Bifunctors+import qualified Data.Bifunctor.Product as Bifunctor+import qualified Data.Bifunctor.Sum as Bifunctor import           Data.Bifunctor.Tannen import           Data.Bifunctor.Wrapped @@ -101,17 +105,25 @@ -- profunctors import           Data.Profunctor as Pro import           Data.Profunctor.Cayley+import           Data.Profunctor.Choice import           Data.Profunctor.Closed-import           Data.Profunctor.Codensity import           Data.Profunctor.Composition+import           Data.Profunctor.Mapping+import           Data.Profunctor.Monad+import           Data.Profunctor.Rep import           Data.Profunctor.Ran-import           Data.Profunctor.Tambara+import           Data.Profunctor.Strong+import           Data.Profunctor.Traversing+import           Data.Profunctor.Unsafe  -- semigroups import           Data.List.NonEmpty (NonEmpty(..)) import qualified Data.Semigroup as Semigroup (First(..), Last(..), Option(..)) import           Data.Semigroup (Min(..), Max(..), Arg(..)) +-- StateVar+import           Data.StateVar (StateVar(..), SettableStateVar(..))+ -- stm import           Control.Concurrent.STM (STM) @@ -207,7 +219,7 @@   ArrowApply a #endif   => Invariant (ArrowMonad a) where-  invmap f _ (ArrowMonad m) = ArrowMonad $ m >>> arr f+  invmap f _ (ArrowMonad m) = ArrowMonad (m >>> arr f)  -- | from @Control.Exception@ instance Invariant Handler where@@ -267,6 +279,9 @@ instance Invariant (Clown f a) where   invmap = invmapFunctor -- | from the @bifunctors@ package+instance Invariant2 p => Invariant (Fix p) where+  invmap f g = In . invmap2 (invmap f g) (invmap g f) f g . out+-- | from the @bifunctors@ package instance Invariant2 p => Invariant (Flip p a) where   invmap = invmap2 id id -- | from the @bifunctors@ package@@ -274,7 +289,7 @@   invmap f g = Join . invmap2 f g f g . runJoin -- | from the @bifunctors@ package instance Invariant g => Invariant (Joker g a) where-  invmap = invmap2 id id+  invmap f g = Joker . invmap f g . runJoker -- | from the @bifunctors@ package instance (Invariant f, Invariant2 p) => Invariant (Tannen f p a) where   invmap = invmap2 id id@@ -339,6 +354,12 @@ instance Invariant2 p => Invariant (Codensity p a) where   invmap = invmap2 id id -- | from the @profunctors@ package+instance Invariant2 p => Invariant (Coprep p) where+  invmap f g (Coprep h) = Coprep (h . invmap2 g f id id)+-- | from the @profunctors@ package+instance Invariant2 p => Invariant (Prep p) where+  invmap f g (Prep x p) = Prep x (invmap2 id id f g p)+-- | from the @profunctors@ package instance Invariant2 p => Invariant (Procompose p q a) where   invmap k k' (Procompose f g) = Procompose (invmap2 id id k k' f) g -- | from the @profunctors@ package@@ -351,7 +372,13 @@ instance Invariant2 p => Invariant (Tambara p a) where   invmap = invmap2 id id -- | from the @profunctors@ package-instance Invariant2 p => Invariant (Cotambara p a) where+instance Invariant (Cotambara p a) where+  invmap = invmapFunctor+-- | from the @profunctors@ package+instance Invariant (CotambaraSum p a) where+  invmap = invmapFunctor+-- | from the @profunctors@ package+instance Invariant2 p => Invariant (TambaraSum p a) where   invmap = invmap2 id id  -- | from the @semigroups@ package@@ -376,6 +403,13 @@ instance Invariant (Arg a) where   invmap = invmapFunctor +-- | from the @StateVar@ package+instance Invariant StateVar where+  invmap f g (StateVar ga sa) = StateVar (fmap f ga) (lmap g sa)+-- | from the @StateVar@ package+instance Invariant SettableStateVar where+  invmap = invmapContravariant+ -- | from the @stm@ package instance Invariant STM where   invmap = invmapFunctor@@ -413,12 +447,14 @@ instance Invariant m => Invariant (Lazy.RWST r w s m) where   invmap f g m = Lazy.RWST $ \r s ->     invmap (mapFstTriple f) (mapFstTriple g) $ Lazy.runRWST m r s-      where mapFstTriple h ~(a, s, w) = (h a, s, w)+      where mapFstTriple :: (a -> b) -> (a, c, d) -> (b, c, d)+            mapFstTriple h ~(a, s, w) = (h a, s, w) -- | from the @transformers@ package instance Invariant m => Invariant (Strict.RWST r w s m) where   invmap f g m = Strict.RWST $ \r s ->     invmap (mapFstTriple f) (mapFstTriple g) $ Strict.runRWST m r s-      where mapFstTriple h (a, s, w) = (h a, s, w)+      where mapFstTriple :: (a -> b) -> (a, c, d) -> (b, c, d)+            mapFstTriple h (a, s, w) = (h a, s, w) -- | from the @transformers@ package instance Invariant m => Invariant (ReaderT r m) where   invmap f g = mapReaderT (invmap f g)@@ -426,20 +462,24 @@ instance Invariant m => Invariant (Lazy.StateT s m) where   invmap f g m = Lazy.StateT $ \s ->     invmap (mapFstPair f) (mapFstPair g) $ Lazy.runStateT m s-      where mapFstPair h ~(a, s) = (h a, s)+      where mapFstPair :: (a -> b) -> (a, c) -> (b, c)+            mapFstPair h ~(a, s) = (h a, s) -- | from the @transformers@ package instance Invariant m => Invariant (Strict.StateT s m) where   invmap f g m = Strict.StateT $ \s ->     invmap (mapFstPair f) (mapFstPair g) $ Strict.runStateT m s-      where mapFstPair h (a, s) = (h a, s)+      where mapFstPair :: (a -> b) -> (a, c) -> (b, c)+            mapFstPair h (a, s) = (h a, s) -- | from the @transformers@ package instance Invariant m => Invariant (Lazy.WriterT w m) where   invmap f g = Lazy.mapWriterT $ invmap (mapFstPair f) (mapFstPair g)-    where mapFstPair h ~(a, w) = (h a, w)+    where mapFstPair :: (a -> b) -> (a, c) -> (b, c)+          mapFstPair h ~(a, w) = (h a, w) -- | from the @transformers@ package instance Invariant m => Invariant (Strict.WriterT w m) where   invmap f g = Strict.mapWriterT $ invmap (mapFstPair f) (mapFstPair g)-    where mapFstPair h (a, w) = (h a, w)+    where mapFstPair :: (a -> b) -> (a, c) -> (b, c)+          mapFstPair h (a, w) = (h a, w) -- | from the @transformers@ package instance (Invariant f, Invariant g) => Invariant (Transformers.Compose f g) where   invmap f g (Transformers.Compose x) =@@ -471,26 +511,32 @@   deriving (Eq, Ord, Read, Show)  instance Functor f => Invariant (WrappedFunctor f) where-  invmap f g = WrapFunctor . invmapFunctor f g . unwrapFunctor+  invmap = invmapFunctor  instance Functor f => Functor (WrappedFunctor f) where   fmap f = WrapFunctor . fmap f . unwrapFunctor+  x <$ WrapFunctor f = WrapFunctor (x <$ f)  instance Applicative f => Applicative (WrappedFunctor f) where   pure = WrapFunctor . pure-  WrapFunctor f <*> WrapFunctor x = WrapFunctor $ f <*> x+  WrapFunctor f <*> WrapFunctor x = WrapFunctor (f <*> x)+  WrapFunctor a *>  WrapFunctor b = WrapFunctor (a *>  b)+  WrapFunctor a <*  WrapFunctor b = WrapFunctor (a <*  b)  instance Alternative f => Alternative (WrappedFunctor f) where   empty = WrapFunctor empty-  WrapFunctor x <|> WrapFunctor y = WrapFunctor $ x <|> y+  WrapFunctor x <|> WrapFunctor y = WrapFunctor (x <|> y)+  some = WrapFunctor . some . unwrapFunctor+  many = WrapFunctor . many . unwrapFunctor  instance Monad m => Monad (WrappedFunctor m) where   return = WrapFunctor . return-  WrapFunctor x >>= f = WrapFunctor $ x >>= unwrapFunctor . f+  WrapFunctor x >>= f = WrapFunctor (x >>= unwrapFunctor . f)+  WrapFunctor a >> WrapFunctor b = WrapFunctor (a >> b)  instance MonadPlus m => MonadPlus (WrappedFunctor m) where   mzero = WrapFunctor mzero-  WrapFunctor x `mplus` WrapFunctor y = WrapFunctor $ x `mplus` y+  WrapFunctor x `mplus` WrapFunctor y = WrapFunctor (x `mplus` y)  instance F.Foldable f => F.Foldable (WrappedFunctor f) where   fold       = F.fold       . unwrapFunctor@@ -529,10 +575,11 @@   deriving (Eq, Ord, Read, Show)  instance Contravariant f => Invariant (WrappedContravariant f) where-  invmap f g = WrapContravariant . invmapContravariant f g . unwrapContravariant+  invmap = invmapContravariant  instance Contravariant f => Contravariant (WrappedContravariant f) where   contramap f = WrapContravariant . contramap f . unwrapContravariant+  x >$ WrapContravariant f = WrapContravariant (x >$ f)  instance Divisible f => Divisible (WrappedContravariant f) where   divide f (WrapContravariant l) (WrapContravariant r) =@@ -606,16 +653,20 @@ instance Invariant g => Invariant2 (Joker g) where   invmap2 _ _ g g' = Joker . invmap g g' . runJoker -- | from the @bifunctors@ package-instance (Invariant2 f, Invariant2 g) => Invariant2 (Bifunctors.Product f g) where-  invmap2 f f' g g' (Bifunctors.Pair x y) =-    Bifunctors.Pair (invmap2 f f' g g' x) (invmap2 f f' g g' y)+instance (Invariant2 f, Invariant2 g) => Invariant2 (Bifunctor.Product f g) where+  invmap2 f f' g g' (Bifunctor.Pair x y) =+    Bifunctor.Pair (invmap2 f f' g g' x) (invmap2 f f' g g' y) -- | from the @bifunctors@ package+instance (Invariant2 p, Invariant2 q) => Invariant2 (Bifunctor.Sum p q) where+  invmap2 f f' g g' (Bifunctor.L2 l) = Bifunctor.L2 (invmap2 f f' g g' l)+  invmap2 f f' g g' (Bifunctor.R2 r) = Bifunctor.R2 (invmap2 f f' g g' r)+-- | from the @bifunctors@ package instance (Invariant f, Invariant2 p) => Invariant2 (Tannen f p) where   invmap2 f f' g g' =     Tannen . invmap (invmap2 f f' g g') (invmap2 f' f g' g) . runTannen -- | from the @bifunctors@ package instance Bifunctor p => Invariant2 (WrappedBifunctor p) where-  invmap2 f f' g g' = WrapBifunctor . invmap2Bifunctor f f' g g' . unwrapBifunctor+  invmap2 = invmap2Bifunctor  -- | from the @contravariant@ package instance Invariant2 Op where@@ -642,7 +693,7 @@   invmap2 f f' g g' (Closure p) = Closure $ invmap2 (f .) (f' .) (g .) (g' .) p -- | from the @profunctors@ package instance Invariant2 (Environment p) where-  invmap2 _ f' g _ (Environment l m r) = Environment (g . l) m (r . f')+  invmap2 = invmap2Profunctor -- | from the @profunctors@ package instance Invariant2 p => Invariant2 (Codensity p) where   invmap2 ac ca bd db (Codensity f) =@@ -662,15 +713,38 @@   invmap2 f f' g g' (Tambara p) =     Tambara $ invmap2 (first f) (first f') (first g) (first g') p -- | from the @profunctors@ package+instance Invariant2 (PastroSum p) where+  invmap2 = invmap2Profunctor+-- | from the @profunctors@ package+instance Invariant2 p => Invariant2 (CofreeMapping p) where+  invmap2 f f' g g' (CofreeMapping p) =+    CofreeMapping (invmap2 (fmap f) (fmap f') (fmap g) (fmap g') p)+-- | from the @profunctors@ package+instance Invariant2 (FreeMapping p) where+  invmap2 = invmap2Profunctor+-- | from the @profunctors@ package+instance Invariant2 p => Invariant2 (CofreeTraversing p) where+  invmap2 f f' g g' (CofreeTraversing p) =+    CofreeTraversing (invmap2 (fmap f) (fmap f') (fmap g) (fmap g') p)+-- | from the @profunctors@ package+instance Invariant2 (FreeTraversing p) where+  invmap2 = invmap2Profunctor+-- | from the @profunctors@ package instance Invariant2 (Pastro p) where-  invmap2 _ f' g _ (Pastro l m r) = Pastro (g . l) m (r . f')+  invmap2 = invmap2Profunctor -- | from the @profunctors@ package-instance Invariant2 p => Invariant2 (Cotambara p) where-  invmap2 f f' g g' (Cotambara p) =-    Cotambara $ invmap2 (left f) (left f') (left g) (left g') p+instance Invariant2 (Cotambara p) where+  invmap2 = invmap2Profunctor -- | from the @profunctors@ package-instance Invariant2 (Copastro p) where-  invmap2 _ f' g _ (Copastro l m r) = Copastro (g . l) m (r . f')+instance Invariant2 (CopastroSum p) where+  invmap2 = invmap2Profunctor+-- | from the @profunctors@ package+instance Invariant2 (CotambaraSum p) where+  invmap2 = invmap2Profunctor+-- | from the @profunctors@ package+instance Invariant2 p => Invariant2 (TambaraSum p) where+  invmap2 f f' g g' (TambaraSum p) =+    TambaraSum (invmap2 (first f) (first f') (first g) (first g') p)  -- | from the @semigroups@ package instance Invariant2 Arg where@@ -693,13 +767,17 @@   deriving (Eq, Ord, Read, Show)  instance Profunctor p => Invariant2 (WrappedProfunctor p) where-  invmap2 f f' g g' = WrapProfunctor . invmap2Profunctor f f' g g' . unwrapProfunctor+  invmap2 = invmap2Profunctor  instance Profunctor p => Invariant (WrappedProfunctor p a) where   invmap = invmap2 id id  instance Profunctor p => Profunctor (WrappedProfunctor p) where   dimap f g = WrapProfunctor . dimap f g . unwrapProfunctor+  lmap f    = WrapProfunctor . lmap f    . unwrapProfunctor+  rmap g    = WrapProfunctor . rmap g    . unwrapProfunctor+  WrapProfunctor x .# f = WrapProfunctor (x .# f)+  g #. WrapProfunctor x = WrapProfunctor (g #. x)  instance Strong p => Strong (WrappedProfunctor p) where   first'  = WrapProfunctor . first'  . unwrapProfunctor@@ -720,6 +798,24 @@ instance Closed p => Closed (WrappedProfunctor p) where   closed = WrapProfunctor . closed . unwrapProfunctor +instance Traversing p => Traversing (WrappedProfunctor p) where+  traverse' = WrapProfunctor . traverse' . unwrapProfunctor+  wander f  = WrapProfunctor . wander f  . unwrapProfunctor++instance Mapping p => Mapping (WrappedProfunctor p) where+  map' = WrapProfunctor . map' . unwrapProfunctor++instance ProfunctorFunctor WrappedProfunctor where+  promap f = WrapProfunctor . f . unwrapProfunctor++instance ProfunctorMonad WrappedProfunctor where+  proreturn = WrapProfunctor+  projoin   = unwrapProfunctor++instance ProfunctorComonad WrappedProfunctor where+  proextract   = unwrapProfunctor+  produplicate = WrapProfunctor+ #if GHC_GENERICS_OK ------------------------------------------------------------------------------- -- GHC Generics@@ -752,6 +848,26 @@ -- likely requires writing your 'Generic1' instance by hand instance (Invariant f, Invariant g) => Invariant ((:.:) f g) where   invmap f g (Comp1 fgp) = Comp1 $ invmap (invmap f g) (invmap g f) fgp++# if __GLASGOW_HASKELL__ >= 800+instance Invariant UAddr where+  invmap _ _ (UAddr a) = UAddr a++instance Invariant UChar where+  invmap _ _ (UChar c) = UChar c++instance Invariant UDouble where+  invmap _ _ (UDouble d) = UDouble d++instance Invariant UFloat where+  invmap _ _ (UFloat f) = UFloat f++instance Invariant UInt where+  invmap _ _ (UInt i) = UInt i++instance Invariant UWord where+  invmap _ _ (UWord w) = UWord w+# endif  {- $ghcgenerics With GHC 7.2 or later, 'Invariant' instances can be defined easily using GHC