packages feed

invariant 0.3.1 → 0.4

raw patch · 6 files changed

+98/−35 lines, 6 filesdep +comonadPVP ok

version bump matches the API change (PVP)

Dependencies added: comonad

API changes (from Hackage documentation)

- Data.Functor.Invariant: instance Data.Functor.Invariant.Invariant (Control.Applicative.Const a)
- Data.Functor.Invariant: instance Data.Functor.Invariant.Invariant (Control.Monad.Trans.Cont.ContT r m)
- Data.Functor.Invariant: instance Data.Functor.Invariant.Invariant2 Control.Applicative.Const
- Data.Functor.Invariant: instance GHC.Arr.Ix i => Data.Functor.Invariant.Invariant (GHC.Arr.Array i)
- 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) (f :: k -> *) (a :: k). GHC.Classes.Eq (f a) => GHC.Classes.Eq (Data.Functor.Invariant.WrappedContravariant f a)
- Data.Functor.Invariant: instance forall (k :: BOX) (f :: k -> *) (a :: k). GHC.Classes.Eq (f a) => GHC.Classes.Eq (Data.Functor.Invariant.WrappedFunctor f a)
- Data.Functor.Invariant: instance forall (k :: BOX) (f :: k -> *) (a :: k). GHC.Classes.Ord (f a) => GHC.Classes.Ord (Data.Functor.Invariant.WrappedContravariant f a)
- Data.Functor.Invariant: instance forall (k :: BOX) (f :: k -> *) (a :: k). GHC.Classes.Ord (f a) => GHC.Classes.Ord (Data.Functor.Invariant.WrappedFunctor f a)
- Data.Functor.Invariant: instance forall (k :: BOX) (f :: k -> *) (a :: k). GHC.Read.Read (f a) => GHC.Read.Read (Data.Functor.Invariant.WrappedContravariant f a)
- Data.Functor.Invariant: instance forall (k :: BOX) (f :: k -> *) (a :: k). GHC.Read.Read (f a) => GHC.Read.Read (Data.Functor.Invariant.WrappedFunctor f a)
- Data.Functor.Invariant: instance forall (k :: BOX) (f :: k -> *) (a :: k). GHC.Show.Show (f a) => GHC.Show.Show (Data.Functor.Invariant.WrappedContravariant f a)
- Data.Functor.Invariant: instance forall (k :: BOX) (f :: k -> *) (a :: k). GHC.Show.Show (f a) => GHC.Show.Show (Data.Functor.Invariant.WrappedFunctor 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) (k1 :: BOX) (p :: k -> k1 -> *) (a :: k) (b :: k1). GHC.Classes.Eq (p a b) => GHC.Classes.Eq (Data.Functor.Invariant.WrappedProfunctor p a b)
- Data.Functor.Invariant: instance forall (k :: BOX) (k1 :: BOX) (p :: k -> k1 -> *) (a :: k) (b :: k1). GHC.Classes.Ord (p a b) => GHC.Classes.Ord (Data.Functor.Invariant.WrappedProfunctor p a b)
- Data.Functor.Invariant: instance forall (k :: BOX) (k1 :: BOX) (p :: k -> k1 -> *) (a :: k) (b :: k1). GHC.Read.Read (p a b) => GHC.Read.Read (Data.Functor.Invariant.WrappedProfunctor p a b)
- Data.Functor.Invariant: instance forall (k :: BOX) (k1 :: BOX) (p :: k -> k1 -> *) (a :: k) (b :: k1). GHC.Show.Show (p a b) => GHC.Show.Show (Data.Functor.Invariant.WrappedProfunctor p a b)
- 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: instance forall (k :: BOX) (s :: k). Data.Functor.Invariant.Invariant (Data.Tagged.Tagged s)
+ Data.Functor.Invariant: instance Control.Arrow.Arrow p => Control.Arrow.Arrow (Data.Functor.Invariant.WrappedProfunctor p)
+ Data.Functor.Invariant: instance Control.Arrow.ArrowChoice p => Control.Arrow.ArrowChoice (Data.Functor.Invariant.WrappedProfunctor p)
+ Data.Functor.Invariant: instance Control.Arrow.ArrowLoop p => Control.Arrow.ArrowLoop (Data.Functor.Invariant.WrappedProfunctor p)
+ Data.Functor.Invariant: instance Control.Arrow.ArrowPlus p => Control.Arrow.ArrowPlus (Data.Functor.Invariant.WrappedProfunctor p)
+ Data.Functor.Invariant: instance Control.Arrow.ArrowZero p => Control.Arrow.ArrowZero (Data.Functor.Invariant.WrappedProfunctor p)
+ Data.Functor.Invariant: instance Control.Comonad.Comonad w => Data.Functor.Invariant.Invariant2 (Control.Comonad.Cokleisli w)
+ Data.Functor.Invariant: instance Data.Functor.Invariant.Invariant (Control.Comonad.Cokleisli w a)
+ Data.Functor.Invariant: instance Data.Functor.Invariant.Invariant (Data.Functor.Const.Const a)
+ Data.Functor.Invariant: instance Data.Functor.Invariant.Invariant (GHC.Arr.Array i)
+ Data.Functor.Invariant: instance Data.Functor.Invariant.Invariant GHC.Generics.UAddr
+ Data.Functor.Invariant: instance Data.Functor.Invariant.Invariant GHC.Generics.UChar
+ Data.Functor.Invariant: instance Data.Functor.Invariant.Invariant GHC.Generics.UDouble
+ Data.Functor.Invariant: instance Data.Functor.Invariant.Invariant GHC.Generics.UFloat
+ Data.Functor.Invariant: instance Data.Functor.Invariant.Invariant GHC.Generics.UInt
+ Data.Functor.Invariant: instance Data.Functor.Invariant.Invariant GHC.Generics.UWord
+ Data.Functor.Invariant: instance Data.Functor.Invariant.Invariant2 Data.Functor.Const.Const
+ Data.Functor.Invariant: instance GHC.Base.Monad m => Data.Functor.Invariant.Invariant (Control.Arrow.Kleisli m a)
+ Data.Functor.Invariant: instance GHC.Base.Monad m => Data.Functor.Invariant.Invariant2 (Control.Arrow.Kleisli m)
+ Data.Functor.Invariant: instance forall k (f :: k -> *) (a :: k). GHC.Classes.Eq (f a) => GHC.Classes.Eq (Data.Functor.Invariant.WrappedContravariant f a)
+ Data.Functor.Invariant: instance forall k (f :: k -> *) (a :: k). GHC.Classes.Eq (f a) => GHC.Classes.Eq (Data.Functor.Invariant.WrappedFunctor f a)
+ Data.Functor.Invariant: instance forall k (f :: k -> *) (a :: k). GHC.Classes.Ord (f a) => GHC.Classes.Ord (Data.Functor.Invariant.WrappedContravariant f a)
+ Data.Functor.Invariant: instance forall k (f :: k -> *) (a :: k). GHC.Classes.Ord (f a) => GHC.Classes.Ord (Data.Functor.Invariant.WrappedFunctor f a)
+ Data.Functor.Invariant: instance forall k (f :: k -> *) (a :: k). GHC.Read.Read (f a) => GHC.Read.Read (Data.Functor.Invariant.WrappedContravariant f a)
+ Data.Functor.Invariant: instance forall k (f :: k -> *) (a :: k). GHC.Read.Read (f a) => GHC.Read.Read (Data.Functor.Invariant.WrappedFunctor f a)
+ Data.Functor.Invariant: instance forall k (f :: k -> *) (a :: k). GHC.Show.Show (f a) => GHC.Show.Show (Data.Functor.Invariant.WrappedContravariant f a)
+ Data.Functor.Invariant: instance forall k (f :: k -> *) (a :: k). GHC.Show.Show (f a) => GHC.Show.Show (Data.Functor.Invariant.WrappedFunctor f a)
+ Data.Functor.Invariant: instance forall k (g :: * -> *) (a :: k). Data.Functor.Invariant.Invariant g => Data.Functor.Invariant.Invariant (Data.Bifunctor.Joker.Joker g a)
+ Data.Functor.Invariant: instance forall k (p :: k -> k -> *). Control.Category.Category p => Control.Category.Category (Data.Functor.Invariant.WrappedProfunctor p)
+ Data.Functor.Invariant: instance forall k (r :: k) (m :: k -> *). Data.Functor.Invariant.Invariant (Control.Monad.Trans.Cont.ContT r m)
+ Data.Functor.Invariant: instance forall k (s :: k). Data.Functor.Invariant.Invariant (Data.Tagged.Tagged s)
+ Data.Functor.Invariant: instance forall k k1 (p :: k -> k1 -> *) (a :: k) (b :: k1). GHC.Classes.Eq (p a b) => GHC.Classes.Eq (Data.Functor.Invariant.WrappedProfunctor p a b)
+ Data.Functor.Invariant: instance forall k k1 (p :: k -> k1 -> *) (a :: k) (b :: k1). GHC.Classes.Ord (p a b) => GHC.Classes.Ord (Data.Functor.Invariant.WrappedProfunctor p a b)
+ Data.Functor.Invariant: instance forall k k1 (p :: k -> k1 -> *) (a :: k) (b :: k1). GHC.Read.Read (p a b) => GHC.Read.Read (Data.Functor.Invariant.WrappedProfunctor p a b)
+ Data.Functor.Invariant: instance forall k k1 (p :: k -> k1 -> *) (a :: k) (b :: k1). GHC.Show.Show (p a b) => GHC.Show.Show (Data.Functor.Invariant.WrappedProfunctor p a b)
+ Data.Functor.Invariant: instance forall k1 (f :: k1 -> *) (a :: k1). Data.Functor.Invariant.Invariant (Data.Bifunctor.Clown.Clown f a)
+ Data.Functor.Invariant: instance forall k1 (p :: * -> * -> *) (g :: * -> *) (f :: k1 -> *) (a :: k1). (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
+ Data.Functor.Invariant: WrapBifunctor :: p a b -> WrappedBifunctor k k1
- Data.Functor.Invariant: [unwrapBifunctor] :: WrappedBifunctor -> p a b
+ Data.Functor.Invariant: [unwrapBifunctor] :: WrappedBifunctor k k1 -> p a b
- Data.Functor.Invariant: invmap :: Invariant f => (a -> b) -> (b -> a) -> f a -> f b
+ Data.Functor.Invariant: invmap :: (Invariant f, Generic1 f, Invariant (Rep1 f)) => (a -> b) -> (b -> a) -> f a -> f b
- Data.Functor.Invariant: newtype WrappedBifunctor (p :: k -> k1 -> *) (a :: k) (b :: k1) :: (k -> k1 -> *) -> k -> k1 -> *
+ Data.Functor.Invariant: newtype WrappedBifunctor k k1 (p :: k -> k1 -> *) (a :: k) (b :: k1) :: forall k k1. (k -> k1 -> *) -> k -> k1 -> *

Files

CHANGELOG.md view
@@ -1,3 +1,11 @@+# 0.4+* Allow TH derivation of `Invariant(2)` instances for datatypes containing+  unboxed tuple types+* Ensure `Invariant(2)` instances are in-scope when importing+  `Data.Functor.Invariant`+* Add `Invariant` and `Invariant2` instances for `Kleisli` and `Cokleisli`+* Add `Category` and `Arrow`-like instances for `WrappedProfunctor`+ # 0.3.1 * Rewrote `Data.Functor.Invariant.TH`'s type inferencer. This avoids a nasty   GHC 7.8-specific bug involving derived `Invariant(2)` instances for data
LICENSE view
@@ -1,4 +1,4 @@-Copyright (c) 2012, University of Kansas+Copyright (c) 2012-2016, University of Kansas All rights reserved.  Redistribution and use in source and binary forms, with or without
invariant.cabal view
@@ -1,5 +1,5 @@ name:                invariant-version:             0.3.1+version:             0.4 synopsis:            Haskell 98 invariant functors description:         Haskell 98 invariant functors category:            Control, Data@@ -33,6 +33,7 @@   build-depends:       array                >= 0.3    && < 0.6                      , base                 >= 4      && < 5                      , bifunctors           >= 5.2    && < 6+                     , comonad              >= 5      && < 6                      , containers           >= 0.1    && < 0.6                      , contravariant        >= 0.5    && < 2                      , ghc-prim
src/Data/Functor/Invariant.hs view
@@ -16,7 +16,7 @@  {-| Module:      Data.Functor.Invariant-Copyright:   (C) 2012-2015 Nicolas Frisby, (C) 2015 Ryan Scott+Copyright:   (C) 2012-2016 Nicolas Frisby, (C) 2015-2016 Ryan Scott License:     BSD-style (see the file LICENSE) Maintainer:  Ryan Scott Portability: Portable@@ -49,9 +49,10 @@   ) where  -- base-import qualified Control.Category as Cat-import           Control.Arrow hiding (first) import           Control.Applicative as App+import qualified Control.Arrow as Arr+import           Control.Arrow hiding (first, second)+import qualified Control.Category as Cat import           Control.Exception (Handler(..)) import           Control.Monad (MonadPlus(..), liftM) import qualified Control.Monad.ST as Strict (ST)@@ -100,6 +101,9 @@ import           Data.Bifunctor.Tannen import           Data.Bifunctor.Wrapped +-- comonad+import           Control.Comonad (Comonad(..), Cokleisli(..), liftW)+ -- containers import           Data.IntMap (IntMap) import           Data.Map (Map)@@ -221,6 +225,9 @@ #endif   => Invariant (ArrowMonad a) where   invmap f _ (ArrowMonad m) = ArrowMonad (m >>> arr f)+-- | from "Control.Arrow"+instance Monad m => Invariant (Kleisli m a) where+  invmap = invmap2 id id  -- | from "Control.Exception" instance Invariant Handler where@@ -348,6 +355,10 @@ instance Bifunctor p => Invariant (WrappedBifunctor p a) where   invmap = invmap2 id id +-- | from the @comonad@ package+instance Invariant (Cokleisli w a) where+  invmap = invmapFunctor+ -- | from the @containers@ package instance Invariant IntMap where   invmap = invmapFunctor@@ -657,6 +668,10 @@ instance Arrow arr => Invariant2 (App.WrappedArrow arr) where   invmap2 _ f' g _ (App.WrapArrow x) = App.WrapArrow $ arr g Cat.. x Cat.. arr f' +-- | from "Control.Arrow"+instance Monad m => Invariant2 (Kleisli m) where+  invmap2 _ f' g _ (Kleisli m) = Kleisli $ liftM g . m . f'+ -- | from "Data.Semigroup" instance Invariant2 Arg where   invmap2 = invmap2Bifunctor@@ -690,6 +705,10 @@ instance Bifunctor p => Invariant2 (WrappedBifunctor p) where   invmap2 = invmap2Bifunctor +-- | from the @comonad@ package+instance Comonad w => Invariant2 (Cokleisli w) where+   invmap2 _ f' g _ (Cokleisli w) = Cokleisli $ g . w . liftW f'+ -- | from the @contravariant@ package instance Invariant2 Op where   invmap2 f f' g g' (Op x) = Op $ invmap2 g g' f f' x@@ -796,6 +815,32 @@   rmap g    = WrapProfunctor . rmap g    . unwrapProfunctor   WrapProfunctor x .# f = WrapProfunctor (x .# f)   g #. WrapProfunctor x = WrapProfunctor (g #. x)++instance Cat.Category p => Cat.Category (WrappedProfunctor p) where+  id = WrapProfunctor Cat.id+  WrapProfunctor p1 . WrapProfunctor p2 = WrapProfunctor (p1 Cat.. p2)++instance Arrow p => Arrow (WrappedProfunctor p) where+  arr    = WrapProfunctor . arr+  first  = WrapProfunctor . Arr.first  . unwrapProfunctor+  second = WrapProfunctor . Arr.second . unwrapProfunctor+  WrapProfunctor p1 *** WrapProfunctor p2 = WrapProfunctor (p1 *** p2)+  WrapProfunctor p1 &&& WrapProfunctor p2 = WrapProfunctor (p1 &&& p2)++instance ArrowZero p => ArrowZero (WrappedProfunctor p) where+  zeroArrow = WrapProfunctor zeroArrow++instance ArrowPlus p => ArrowPlus (WrappedProfunctor p) where+  WrapProfunctor p1 <+> WrapProfunctor p2 = WrapProfunctor (p1 <+> p2)++instance ArrowChoice p => ArrowChoice (WrappedProfunctor p) where+  left  = WrapProfunctor . left  . unwrapProfunctor+  right = WrapProfunctor . right . unwrapProfunctor+  WrapProfunctor p1 +++ WrapProfunctor p2 = WrapProfunctor (p1 +++ p2)+  WrapProfunctor p1 ||| WrapProfunctor p2 = WrapProfunctor (p1 ||| p2)++instance ArrowLoop p => ArrowLoop (WrappedProfunctor p) where+  loop = WrapProfunctor . loop . unwrapProfunctor  instance Strong p => Strong (WrappedProfunctor p) where   first'  = WrapProfunctor . first'  . unwrapProfunctor
src/Data/Functor/Invariant/TH.hs view
@@ -2,7 +2,7 @@  {-| Module:      Data.Functor.Invariant.TH-Copyright:   (C) 2012-2015 Nicolas Frisby, (C) 2015 Ryan Scott+Copyright:   (C) 2012-2016 Nicolas Frisby, (C) 2015-2016 Ryan Scott License:     BSD-style (see the file LICENSE) Maintainer:  Ryan Scott Portability: Template Haskell@@ -345,37 +345,45 @@         mentionsTyArgs :: Bool         mentionsTyArgs = any (`mentionsName` tyVarNames) tyArgs -        makeInvmapTuple :: Type -> Name -> Q Exp-        makeInvmapTuple fieldTy fieldName =+        makeInvmapTuple :: ([Q Pat] -> Q Pat) -> ([Q Exp] -> Q Exp) -> Int -> Q Exp+        makeInvmapTuple mkTupP mkTupE n = do+            x  <- newName "x"+            xs <- newNameList "x" n+            lamE [varP x] $ caseE (varE x)+                [ match (mkTupP $ map varP xs)+                        (normalB . mkTupE $ zipWith makeInvmapTupleField tyArgs xs)+                        []+                ]++        makeInvmapTupleField :: Type -> Name -> Q Exp+        makeInvmapTupleField fieldTy fieldName =             appE (makeInvmapForType iClass conName tvMap covariant fieldTy) $ varE fieldName       in case tyCon of-             ArrowT | mentionsTyArgs ->-                 let [argTy, resTy] = tyArgs-                  in do x <- newName "x"-                        b <- newName "b"-                        lamE [varP x, varP b] $-                          makeInvmapForType iClass conName tvMap covariant resTy `appE` (varE x `appE`-                            (makeInvmapForType iClass conName tvMap (not covariant) argTy `appE` varE b))-             TupleT n | n > 0 && mentionsTyArgs -> do-                 x  <- newName "x"-                 xs <- newNameList "x" n-                 lamE [varP x] $ caseE (varE x)-                     [ match (tupP $ map varP xs)-                             (normalB . tupE $ zipWith makeInvmapTuple tyArgs xs)-                             []-                     ]-             _ -> do-                 itf <- isTyFamily tyCon-                 if any (`mentionsName` tyVarNames) lhsArgs || (itf && mentionsTyArgs)-                      then outOfPlaceTyVarError conName tyVarNames-                      else if any (`mentionsName` tyVarNames) rhsArgs-                           then appsE $-                                ( varE (invmapName (toEnum numLastArgs))-                                : doubleMap (makeInvmapForType iClass conName tvMap) rhsArgs-                                )-                           else do x <- newName "x"-                                   lamE [varP x] $ varE x+          ArrowT | mentionsTyArgs ->+              let [argTy, resTy] = tyArgs+               in do x <- newName "x"+                     b <- newName "b"+                     lamE [varP x, varP b] $+                       makeInvmapForType iClass conName tvMap covariant resTy `appE` (varE x `appE`+                         (makeInvmapForType iClass conName tvMap (not covariant) argTy `appE` varE b))+#if MIN_VERSION_template_haskell(2,6,0)+          UnboxedTupleT n+            | n > 0 && mentionsTyArgs -> makeInvmapTuple unboxedTupP unboxedTupE n+#endif+          TupleT n+            | n > 0 && mentionsTyArgs -> makeInvmapTuple tupP tupE n+          _ -> do+              itf <- isTyFamily tyCon+              if any (`mentionsName` tyVarNames) lhsArgs || (itf && mentionsTyArgs)+                   then outOfPlaceTyVarError conName tyVarNames+                   else if any (`mentionsName` tyVarNames) rhsArgs+                        then appsE $+                             ( varE (invmapName (toEnum numLastArgs))+                             : doubleMap (makeInvmapForType iClass conName tvMap) rhsArgs+                             )+                        else do x <- newName "x"+                                lamE [varP x] $ varE x  ------------------------------------------------------------------------------- -- Template Haskell reifying and AST manipulation
src/Data/Functor/Invariant/TH/Internal.hs view
@@ -2,7 +2,7 @@  {-| Module:      Data.Functor.Invariant.TH.Internal-Copyright:   (C) 2012-2015 Nicolas Frisby, (C) 2015 Ryan Scott+Copyright:   (C) 2012-2016 Nicolas Frisby, (C) 2015-2016 Ryan Scott License:     BSD-style (see the file LICENSE) Maintainer:  Ryan Scott Portability: Template Haskell@@ -14,6 +14,7 @@ import           Control.Monad (liftM)  import           Data.Foldable (foldr')+import           Data.Functor.Invariant () -- To import the instances import           Data.List import qualified Data.Map as Map (fromList, findWithDefault, singleton) import           Data.Map (Map)