packages feed

hs-functors 0.1.0.0 → 0.1.1.0

raw patch · 9 files changed

+346/−13 lines, 9 filesdep ~basePVP: major bump suggested

API removals or changes: PVP suggests a major version bump

Dependency ranges changed: base

API changes (from Hackage documentation)

- Data.Profunctor: instance GHC.Base.Monad m => Data.Profunctor.Profunctor (Control.Arrow.Kleisli m)
+ Control.Comonad: (<<=) :: Comonad ɯ => (ɯ a -> b) -> ɯ a -> ɯ b
+ Control.Comonad: (=<=) :: Comonad ɯ => (ɯ b -> c) -> (ɯ a -> b) -> ɯ a -> c
+ Control.Comonad: (=>=) :: Comonad ɯ => (ɯ a -> b) -> (ɯ b -> c) -> ɯ a -> c
+ Control.Comonad: (=>>) :: Comonad ɯ => ɯ a -> (ɯ a -> b) -> ɯ b
+ Control.Comonad: Cokleisli :: (ɯ a -> b) -> Cokleisli ɯ a b
+ Control.Comonad: [runCokleisli] :: Cokleisli ɯ a b -> ɯ a -> b
+ Control.Comonad: class Functor ɯ => Comonad ɯ where cut = (<<=) id (<<=) f = fmap f . cut
+ Control.Comonad: copure :: Comonad ɯ => ɯ a -> a
+ Control.Comonad: cut :: Comonad ɯ => ɯ a -> ɯ (ɯ a)
+ Control.Comonad: infixl 1 =>>
+ Control.Comonad: infixr 1 =<=
+ Control.Comonad: instance (Data.Semigroup.Semigroup m, GHC.Base.Monoid m) => Control.Comonad.Comonad ((->) m)
+ Control.Comonad: instance Control.Comonad.Comonad ((,) a)
+ Control.Comonad: instance Control.Comonad.Comonad (Data.Semigroup.Arg a)
+ Control.Comonad: instance Control.Comonad.Comonad Data.Functor.Identity.Identity
+ Control.Comonad: instance Control.Comonad.Comonad Data.List.NonEmpty.NonEmpty
+ Control.Comonad: instance Control.Comonad.Comonad ɯ => Control.Category.Category (Control.Comonad.Cokleisli ɯ)
+ Control.Comonad: instance Control.Comonad.Comonad ɯ => Control.Comonad.Comonad (Control.Monad.Trans.Identity.IdentityT ɯ)
+ Control.Comonad: instance forall k (ɯ :: k -> *) (a :: k). GHC.Base.Applicative (Control.Comonad.Cokleisli ɯ a)
+ Control.Comonad: instance forall k (ɯ :: k -> *) (a :: k). GHC.Base.Functor (Control.Comonad.Cokleisli ɯ a)
+ Control.Comonad: instance forall k (ɯ :: k -> *) (a :: k). GHC.Base.Monad (Control.Comonad.Cokleisli ɯ a)
+ Control.Comonad: newtype Cokleisli ɯ a b
+ Control.Comonad: wfix :: Comonad ɯ => (ɯ a -> a) -> ɯ a
+ Control.Comonad.Trans.Class: class ComonadTrans t
+ Control.Comonad.Trans.Class: colift :: (ComonadTrans t, Comonad ɯ) => t ɯ a -> ɯ a
+ Control.Comonad.Trans.Class: instance Control.Comonad.Trans.Class.ComonadTrans Control.Monad.Trans.Identity.IdentityT
+ Control.Monad.Morph: class MFunctor t
+ Control.Monad.Morph: class (MonadTrans t, MFunctor t) => MMonad t where mjoin = mbind id mbind f = mjoin . mmap f
+ Control.Monad.Morph: instance Control.Monad.Morph.MFunctor (Control.Monad.Trans.Except.ExceptT e)
+ Control.Monad.Morph: instance Control.Monad.Morph.MFunctor (Control.Monad.Trans.Reader.ReaderT r)
+ Control.Monad.Morph: instance Control.Monad.Morph.MFunctor (Control.Monad.Trans.State.Lazy.StateT s)
+ Control.Monad.Morph: instance Control.Monad.Morph.MFunctor (Control.Monad.Trans.Writer.Lazy.WriterT w)
+ Control.Monad.Morph: instance Control.Monad.Morph.MFunctor Control.Monad.Trans.Identity.IdentityT
+ Control.Monad.Morph: instance Control.Monad.Morph.MFunctor Control.Monad.Trans.Maybe.MaybeT
+ Control.Monad.Morph: instance Control.Monad.Morph.MMonad (Control.Monad.Trans.Except.ExceptT e)
+ Control.Monad.Morph: instance Control.Monad.Morph.MMonad (Control.Monad.Trans.Reader.ReaderT r)
+ Control.Monad.Morph: instance Control.Monad.Morph.MMonad Control.Monad.Trans.Identity.IdentityT
+ Control.Monad.Morph: instance Control.Monad.Morph.MMonad Control.Monad.Trans.Maybe.MaybeT
+ Control.Monad.Morph: instance GHC.Base.Functor f => Control.Monad.Morph.MFunctor (Data.Functor.Compose.Compose f)
+ Control.Monad.Morph: instance GHC.Base.Monoid w => Control.Monad.Morph.MMonad (Control.Monad.Trans.Writer.Lazy.WriterT w)
+ Control.Monad.Morph: instance forall k (f :: k -> *). Control.Monad.Morph.MFunctor (Data.Functor.Product.Product f)
+ Control.Monad.Morph: instance forall k (f :: k -> *). Control.Monad.Morph.MFunctor (Data.Functor.Sum.Sum f)
+ Control.Monad.Morph: mbind :: (MMonad t, Monad n) => (forall a. m a -> t n a) -> t m a -> t n a
+ Control.Monad.Morph: mjoin :: (MMonad t, Monad m) => t (t m) a -> t m a
+ Control.Monad.Morph: mmap :: MFunctor t => (forall a. m a -> n a) -> t m a -> t n a
+ Control.Monad.Trans.Compose: ComposeT :: s (t m) a -> ComposeT s t m a
+ Control.Monad.Trans.Compose: [getComposeT] :: ComposeT s t m a -> s (t m) a
+ Control.Monad.Trans.Compose: instance (Control.Monad.Morph.MFunctor s, Control.Monad.Trans.Class.MonadTrans s, Control.Monad.Trans.Class.MonadTrans t) => Control.Monad.Trans.Class.MonadTrans (Control.Monad.Trans.Compose.ComposeT s t)
+ Control.Monad.Trans.Compose: instance forall k (s :: k -> * -> *) k1 (t :: k1 -> k) (m :: k1). Data.Foldable.Foldable (s (t m)) => Data.Foldable.Foldable (Control.Monad.Trans.Compose.ComposeT s t m)
+ Control.Monad.Trans.Compose: instance forall k (s :: k -> * -> *) k1 (t :: k1 -> k) (m :: k1). Data.Functor.Classes.Eq1 (s (t m)) => Data.Functor.Classes.Eq1 (Control.Monad.Trans.Compose.ComposeT s t m)
+ Control.Monad.Trans.Compose: instance forall k (s :: k -> * -> *) k1 (t :: k1 -> k) (m :: k1). Data.Functor.Classes.Ord1 (s (t m)) => Data.Functor.Classes.Ord1 (Control.Monad.Trans.Compose.ComposeT s t m)
+ Control.Monad.Trans.Compose: instance forall k (s :: k -> * -> *) k1 (t :: k1 -> k) (m :: k1). Data.Functor.Classes.Read1 (s (t m)) => Data.Functor.Classes.Read1 (Control.Monad.Trans.Compose.ComposeT s t m)
+ Control.Monad.Trans.Compose: instance forall k (s :: k -> * -> *) k1 (t :: k1 -> k) (m :: k1). Data.Functor.Classes.Show1 (s (t m)) => Data.Functor.Classes.Show1 (Control.Monad.Trans.Compose.ComposeT s t m)
+ Control.Monad.Trans.Compose: instance forall k (s :: k -> * -> *) k1 (t :: k1 -> k) (m :: k1). Data.Functor.Contravariant.Functor (s (t m)) => Data.Functor.Contravariant.Functor (Control.Monad.Trans.Compose.ComposeT s t m)
+ Control.Monad.Trans.Compose: instance forall k (s :: k -> * -> *) k1 (t :: k1 -> k) (m :: k1). Data.Traversable.Traversable (s (t m)) => Data.Traversable.Traversable (Control.Monad.Trans.Compose.ComposeT s t m)
+ Control.Monad.Trans.Compose: instance forall k (s :: k -> * -> *) k1 (t :: k1 -> k) (m :: k1). GHC.Base.Alternative (s (t m)) => GHC.Base.Alternative (Control.Monad.Trans.Compose.ComposeT s t m)
+ Control.Monad.Trans.Compose: instance forall k (s :: k -> * -> *) k1 (t :: k1 -> k) (m :: k1). GHC.Base.Applicative (s (t m)) => GHC.Base.Applicative (Control.Monad.Trans.Compose.ComposeT s t m)
+ Control.Monad.Trans.Compose: instance forall k (s :: k -> * -> *) k1 (t :: k1 -> k) (m :: k1). GHC.Base.Functor (s (t m)) => GHC.Base.Functor (Control.Monad.Trans.Compose.ComposeT s t m)
+ Control.Monad.Trans.Compose: instance forall k (s :: k -> * -> *) k1 (t :: k1 -> k) (m :: k1). GHC.Base.Monad (s (t m)) => GHC.Base.Monad (Control.Monad.Trans.Compose.ComposeT s t m)
+ Control.Monad.Trans.Compose: instance forall k (s :: k -> * -> *) k1 (t :: k1 -> k) (m :: k1). GHC.Base.MonadPlus (s (t m)) => GHC.Base.MonadPlus (Control.Monad.Trans.Compose.ComposeT s t m)
+ Control.Monad.Trans.Compose: instance forall k k1 (s :: k -> k1 -> *) k2 (t :: k2 -> k) (m :: k2) (a :: k1). Data.Semigroup.Semigroup (s (t m) a) => Data.Semigroup.Semigroup (Control.Monad.Trans.Compose.ComposeT s t m a)
+ Control.Monad.Trans.Compose: instance forall k k1 (s :: k -> k1 -> *) k2 (t :: k2 -> k) (m :: k2) (a :: k1). GHC.Base.Monoid (s (t m) a) => GHC.Base.Monoid (Control.Monad.Trans.Compose.ComposeT s t m a)
+ Control.Monad.Trans.Compose: instance forall k k1 (s :: k -> k1 -> *) k2 (t :: k2 -> k) (m :: k2) (a :: k1). GHC.Classes.Eq (s (t m) a) => GHC.Classes.Eq (Control.Monad.Trans.Compose.ComposeT s t m a)
+ Control.Monad.Trans.Compose: instance forall k k1 (s :: k -> k1 -> *) k2 (t :: k2 -> k) (m :: k2) (a :: k1). GHC.Classes.Ord (s (t m) a) => GHC.Classes.Ord (Control.Monad.Trans.Compose.ComposeT s t m a)
+ Control.Monad.Trans.Compose: instance forall k k1 (s :: k -> k1 -> *) k2 (t :: k2 -> k) (m :: k2) (a :: k1). GHC.Enum.Bounded (s (t m) a) => GHC.Enum.Bounded (Control.Monad.Trans.Compose.ComposeT s t m a)
+ Control.Monad.Trans.Compose: instance forall k k1 (s :: k -> k1 -> *) k2 (t :: k2 -> k) (m :: k2) (a :: k1). GHC.Read.Read (s (t m) a) => GHC.Read.Read (Control.Monad.Trans.Compose.ComposeT s t m a)
+ Control.Monad.Trans.Compose: instance forall k k1 (s :: k -> k1 -> *) k2 (t :: k2 -> k) (m :: k2) (a :: k1). GHC.Show.Show (s (t m) a) => GHC.Show.Show (Control.Monad.Trans.Compose.ComposeT s t m a)
+ Control.Monad.Trans.Compose: instance forall k k1 k2 (s :: (k2 -> *) -> k1 -> *) (t :: (k -> *) -> k2 -> *). (Control.Monad.Morph.MFunctor s, Control.Monad.Morph.MFunctor t) => Control.Monad.Morph.MFunctor (Control.Monad.Trans.Compose.ComposeT s t)
+ Control.Monad.Trans.Compose: newtype ComposeT s t m a
+ Data.Bifunctor.Braided: braid :: Braided f => f a b -> f b a
+ Data.Bifunctor.Braided: class Braided f
+ Data.Bifunctor.Braided: instance Data.Bifunctor.Braided.Braided (,)
+ Data.Bifunctor.Braided: instance Data.Bifunctor.Braided.Braided Data.Either.Either
+ Data.Cotraversable: class Functor f => Cotraversable f where collect f = cosequence . fmap f cosequence = collect id cotraverse f = fmap f . cosequence
+ Data.Cotraversable: collect :: (Cotraversable f, Functor g) => (a -> f b) -> g a -> f (g b)
+ Data.Cotraversable: cosequence :: (Cotraversable f, Functor g) => g (f a) -> f (g a)
+ Data.Cotraversable: cotraverse :: (Cotraversable f, Functor g) => (g a -> b) -> g (f a) -> f b
+ Data.Cotraversable: instance (Data.Cotraversable.Cotraversable f, Data.Cotraversable.Cotraversable g) => Data.Cotraversable.Cotraversable (Data.Functor.Compose.Compose f g)
+ Data.Cotraversable: instance (Data.Cotraversable.Cotraversable f, Data.Cotraversable.Cotraversable g) => Data.Cotraversable.Cotraversable (Data.Functor.Product.Product f g)
+ Data.Cotraversable: instance Data.Cotraversable.Cotraversable ((->) r)
+ Data.Cotraversable: instance Data.Cotraversable.Cotraversable Data.Functor.Identity.Identity
+ Data.Cotraversable: instance Data.Cotraversable.Cotraversable Data.Proxy.Proxy
+ Data.Cotraversable: instance Data.Cotraversable.Cotraversable f => Data.Cotraversable.Cotraversable (Control.Applicative.Backwards.Backwards f)
+ Data.Cotraversable: instance Data.Cotraversable.Cotraversable f => Data.Cotraversable.Cotraversable (Control.Monad.Trans.Identity.IdentityT f)
+ Data.Cotraversable: instance Data.Cotraversable.Cotraversable f => Data.Cotraversable.Cotraversable (Control.Monad.Trans.Reader.ReaderT r f)
+ Data.Cotraversable: instance Data.Cotraversable.Cotraversable f => Data.Cotraversable.Cotraversable (Data.Functor.Reverse.Reverse f)
+ Data.Functor.Contravariant: instance (Data.Semigroup.Semigroup a, GHC.Base.Monoid a) => GHC.Base.Monoid (Data.Functor.Contravariant.Op1 a b)
+ Data.Functor.Contravariant: instance (Data.Semigroup.Semigroup a, GHC.Base.Monoid a) => GHC.Base.Monoid (Data.Functor.Contravariant.Op2 a b)
+ Data.Functor.Contravariant: instance Control.Category.Category Data.Functor.Contravariant.Op1
+ Data.Functor.Contravariant: instance Data.Semigroup.Semigroup a => Data.Semigroup.Semigroup (Data.Functor.Contravariant.Op1 a b)
+ Data.Functor.Contravariant: instance Data.Semigroup.Semigroup a => Data.Semigroup.Semigroup (Data.Functor.Contravariant.Op2 a b)
+ Data.Profunctor: (&&&) :: Strong (,) p => p a b₁ -> p a b₂ -> p a (b₁, b₂)
+ Data.Profunctor: (***) :: Strong (,) p => p a₁ b₁ -> p a₂ b₂ -> p (a₁, a₂) (b₁, b₂)
+ Data.Profunctor: (+++) :: Strong Either p => p a₁ b₁ -> p a₂ b₂ -> p (Either a₁ a₂) (Either b₁ b₂)
+ Data.Profunctor: (<<^) :: Profunctor p => p b c -> (a -> b) -> p a c
+ Data.Profunctor: (>>^) :: Profunctor p => p a b -> (b -> c) -> p a c
+ Data.Profunctor: (^<<) :: Profunctor p => (b -> c) -> p a b -> p a c
+ Data.Profunctor: (^>>) :: Profunctor p => (a -> b) -> p b c -> p a c
+ Data.Profunctor: (|||) :: Strong Either p => p a₁ b -> p a₂ b -> p (Either a₁ a₂) b
+ Data.Profunctor: class Profunctor p => Closed f p
+ Data.Profunctor: class Profunctor p => Costrong f p where costrongL = costrongR . dimap braid braid costrongR = costrongL . dimap braid braid
+ Data.Profunctor: class Profunctor p => Strong f p
+ Data.Profunctor: closed :: Closed f p => p a b -> p (f a) (f b)
+ Data.Profunctor: costrongL :: (Costrong f p, Braided f) => p (f a c) (f b c) -> p a b
+ Data.Profunctor: costrongR :: (Costrong f p, Braided f) => p (f a b) (f a c) -> p b c
+ Data.Profunctor: infixr 1 ^<<
+ Data.Profunctor: infixr 2 |||
+ Data.Profunctor: infixr 3 &&&
+ Data.Profunctor: instance (Data.Cotraversable.Cotraversable f, GHC.Base.Functor ɯ) => Data.Profunctor.Closed f (Control.Comonad.Cokleisli ɯ)
+ Data.Profunctor: instance (Data.Traversable.Traversable f, GHC.Base.Applicative p) => Data.Profunctor.Closed f (Control.Arrow.Kleisli p)
+ Data.Profunctor: instance Control.Comonad.Comonad ɯ => Data.Profunctor.Strong Data.Either.Either (Control.Comonad.Cokleisli ɯ)
+ Data.Profunctor: instance Control.Monad.Fix.MonadFix m => Data.Profunctor.Costrong (,) (Control.Arrow.Kleisli m)
+ Data.Profunctor: instance Data.Profunctor.Costrong (,) (->)
+ Data.Profunctor: instance Data.Profunctor.Costrong Data.Either.Either (->)
+ Data.Profunctor: instance Data.Profunctor.Strong (,) (->)
+ Data.Profunctor: instance Data.Profunctor.Strong Data.Either.Either (->)
+ Data.Profunctor: instance GHC.Base.Applicative p => Data.Profunctor.Strong (,) (Control.Arrow.Kleisli p)
+ Data.Profunctor: instance GHC.Base.Functor f => Data.Profunctor.Closed f (->)
+ Data.Profunctor: instance GHC.Base.Functor f => Data.Profunctor.Costrong Data.Either.Either (Control.Comonad.Cokleisli f)
+ Data.Profunctor: instance GHC.Base.Functor f => Data.Profunctor.Profunctor (Control.Arrow.Kleisli f)
+ Data.Profunctor: instance GHC.Base.Functor f => Data.Profunctor.Profunctor (Control.Comonad.Cokleisli f)
+ Data.Profunctor: instance GHC.Base.Functor f => Data.Profunctor.Strong Data.Either.Either (Control.Arrow.Kleisli f)
+ Data.Profunctor: instance GHC.Base.Monad m => Data.Profunctor.Costrong Data.Either.Either (Control.Arrow.Kleisli m)
+ Data.Profunctor: strong :: Strong f p => p a₁ b₁ -> p a₂ b₂ -> p (f a₁ a₂) (f b₁ b₂)

Files

+ Control/Comonad.hs view
@@ -0,0 +1,70 @@+{-# LANGUAGE NoImplicitPrelude #-}++module Control.Comonad where++import Control.Applicative+import Control.Category+import Control.Monad+import Control.Monad.Trans.Identity+import Data.Function (($), fix, flip)+import Data.Functor.Identity+import Data.List.NonEmpty+import Data.Semigroup (Arg (..), Semigroup (..))+import Data.Monoid (Monoid (..))++infixl 1 =>>+infixr 1 <<=, =>=, =<=++class Functor ɯ => Comonad ɯ where+    copure :: ɯ a -> a++    cut :: ɯ a -> ɯ (ɯ a)+    cut = (<<=) id++    (<<=) :: (ɯ a -> b) -> ɯ a -> ɯ b+    (<<=) f = fmap f . cut++(=>>) :: Comonad ɯ => ɯ a -> (ɯ a -> b) -> ɯ b+(=>>) = flip (<<=)++(=>=) :: Comonad ɯ => (ɯ a -> b) -> (ɯ b -> c) -> ɯ a -> c+f =>= g = g . (<<=) f++(=<=) :: Comonad ɯ => (ɯ b -> c) -> (ɯ a -> b) -> ɯ a -> c+(=<=) = flip (=>=)++wfix :: Comonad ɯ => (ɯ a -> a) -> ɯ a+wfix f = fix (fmap f . cut)++instance Comonad Identity where+    copure = runIdentity+    cut = Identity++instance Comonad NonEmpty where+    copure = head+    cut (x:|xs) = (x:|xs) :| go xs+      where go [] = []+            go (x:xs) = (x:|xs) : go xs++instance (Semigroup m, Monoid m) => Comonad ((->) m) where+    copure = ($ mempty)+    cut f x y = f (x <> y)++instance Comonad ((,) a) where+    copure (_, b) = b+    cut (a, b) = (a, (a, b))++instance Comonad (Arg a) where+    copure (Arg _ b) = b+    cut (Arg a b) = Arg a (Arg a b)++instance Comonad ɯ => Comonad (IdentityT ɯ) where+    copure = copure . runIdentityT+    cut (IdentityT x) = IdentityT (IdentityT <$> cut x)++newtype Cokleisli ɯ a b = Cokleisli { runCokleisli :: ɯ a -> b }+    deriving (Functor, Applicative, Monad)++instance Comonad ɯ => Category (Cokleisli ɯ) where+    id = Cokleisli copure+    Cokleisli f . Cokleisli g = Cokleisli (f =<= g)
+ Control/Comonad/Trans/Class.hs view
@@ -0,0 +1,9 @@+module Control.Comonad.Trans.Class where++import Control.Comonad+import Control.Monad.Trans.Identity++class ComonadTrans t where+    colift :: Comonad ɯ => t ɯ a -> ɯ a++instance ComonadTrans IdentityT where colift = runIdentityT
+ Control/Monad/Morph.hs view
@@ -0,0 +1,46 @@+{-# LANGUAGE RankNTypes #-}++module Control.Monad.Morph where++import Control.Monad+import Control.Monad.Trans.Class+import Control.Monad.Trans.Except+import Control.Monad.Trans.Identity+import Control.Monad.Trans.Maybe+import Control.Monad.Trans.Reader+import Control.Monad.Trans.State+import Control.Monad.Trans.Writer+import Data.Functor.Compose+import Data.Functor.Product+import Data.Functor.Sum+import Data.Monoid ((<>))++class MFunctor t where+    mmap :: (∀ a . m a -> n a) -> t m a -> t n a++class (MonadTrans t, MFunctor t) => MMonad t where+    mjoin :: Monad m => t (t m) a -> t m a+    mjoin = mbind id++    mbind :: Monad n => (∀ a . m a -> t n a) -> t m a -> t n a+    mbind f = mjoin . mmap f++instance Functor f => MFunctor (Compose f) where mmap f (Compose x) = Compose (f <$> x)+instance MFunctor (Product f) where mmap f (Pair x y) = Pair x (f y)+instance MFunctor (Sum f) where+    mmap _ (InL x) = InL x+    mmap f (InR y) = InR (f y)++instance MFunctor (ExceptT e) where mmap = mapExceptT+instance MFunctor IdentityT   where mmap = mapIdentityT+instance MFunctor MaybeT      where mmap = mapMaybeT+instance MFunctor (ReaderT r) where mmap = mapReaderT+instance MFunctor (StateT  s) where mmap = mapStateT+instance MFunctor (WriterT w) where mmap = mapWriterT++instance MMonad (ExceptT e) where mjoin (ExceptT   (ExceptT   x)) = ExceptT (join <$> x)+instance MMonad IdentityT   where mjoin (IdentityT (IdentityT x)) = IdentityT x+instance MMonad MaybeT      where mjoin (MaybeT    (MaybeT    x)) = MaybeT (join <$> x)+instance MMonad (ReaderT r) where mjoin (ReaderT f) = ReaderT (join (runReaderT . f))+instance Monoid w => MMonad (WriterT w) where+    mjoin (WriterT (WriterT x)) = WriterT ((\ ((a, u), v) -> (a, u <> v)) <$> x)
+ Control/Monad/Trans/Compose.hs view
@@ -0,0 +1,20 @@+module Control.Monad.Trans.Compose where++import Control.Applicative+import Control.Monad+import Control.Monad.Morph+import Control.Monad.Trans.Class+import Data.Functor.Classes+import qualified Data.Functor.Contravariant as Contravar+import Data.Semigroup (Semigroup (..))++newtype ComposeT s t m a = ComposeT { getComposeT :: s (t m) a }+  deriving (Functor, Applicative, Monad, Foldable, Traversable, Alternative, MonadPlus,+            Eq, Ord, Bounded, Read, Show, Semigroup, Monoid, Eq1, Ord1, Read1, Show1,+            Contravar.Functor)++instance (MFunctor s, MonadTrans s, MonadTrans t) => MonadTrans (ComposeT s t) where+    lift = ComposeT . mmap lift . lift++instance (MFunctor s, MFunctor t) => MFunctor (ComposeT s t) where+    mmap f (ComposeT x) = ComposeT (mmap (mmap f) x)
+ Data/Bifunctor/Braided.hs view
@@ -0,0 +1,8 @@+module Data.Bifunctor.Braided where++class Braided f where braid :: f a b -> f b a++instance Braided (,) where braid (x, y) = (y, x)+instance Braided Either where+    braid (Left  x) = Right x+    braid (Right y) = Left  y
+ Data/Cotraversable.hs view
@@ -0,0 +1,50 @@+module Data.Cotraversable where++import Control.Applicative+import Control.Applicative.Backwards+import Control.Monad.Trans.Identity+import Control.Monad.Trans.Reader+import Data.Functor.Compose+import Data.Functor.Identity+import Data.Functor.Product+import Data.Functor.Reverse+import Data.Proxy++class Functor f => Cotraversable f where+    collect :: Functor g => (a -> f b) -> g a -> f (g b)+    collect f = cosequence . fmap f++    cosequence :: Functor g => g (f a) -> f (g a)+    cosequence = collect id++    cotraverse :: Functor g => (g a -> b) -> g (f a) -> f b+    cotraverse f = fmap f . cosequence++instance Cotraversable Identity where+    cosequence = Identity . fmap runIdentity++instance Cotraversable ((->) r) where+    cosequence x a = ($ a) <$> x++instance Cotraversable Proxy where+    cosequence _ = Proxy++instance Cotraversable f => Cotraversable (IdentityT f) where+    cosequence = IdentityT . collect runIdentityT++instance Cotraversable f => Cotraversable (ReaderT r f) where+    cosequence x = ReaderT $ \ a -> flip runReaderT a `collect` x++instance Cotraversable f => Cotraversable (Reverse f) where+    cosequence = Reverse . collect getReverse++instance Cotraversable f => Cotraversable (Backwards f) where+    cosequence = Backwards . collect forwards++instance (Cotraversable f, Cotraversable g) => Cotraversable (Compose f g) where+    cosequence = Compose . fmap cosequence . collect getCompose++instance (Cotraversable f, Cotraversable g) => Cotraversable (Product f g) where+    cosequence = liftA2 Pair (collect fstP) (collect sndP)+      where fstP (Pair a _) = a+            sndP (Pair _ b) = b
Data/Functor/Contravariant.hs view
@@ -1,20 +1,20 @@ module Data.Functor.Contravariant where -import Prelude hiding (Functor)+import Prelude hiding (Functor, (.), id) +import Control.Applicative import Control.Applicative.Backwards import Control.Arrow+import Control.Category import Control.Monad.Trans.Except import Control.Monad.Trans.Reader import Control.Monad.Trans.State import Control.Monad.Trans.Writer import Data.Function (on)-import qualified Data.Functor as Covar-import Data.Functor.Compose-import Data.Functor.Const import Data.Functor.Product import Data.Functor.Reverse import Data.Functor.Sum+import Data.Semigroup (Semigroup (..)) import Data.Monoid (Alt (..)) import Data.Proxy @@ -26,9 +26,6 @@ (>$<) :: Functor f => (a -> b) -> f b -> f a (>$<) = gmap -newtype Op1 b a = Op1 { op1 :: a -> b }-newtype Op2 b a = Op2 { op2 :: a -> a -> b }- instance Functor (Op1 a) where gmap f (Op1 g) = Op1 (g . f) instance Functor (Op2 a) where gmap f (Op2 g) = Op2 (g `on` f) instance Functor (Const a) where gmap _ (Const a) = Const a@@ -46,3 +43,24 @@ instance Functor f => Functor (StateT  s f) where     gmap f = StateT  . (fmap . gmap) (f *** id) . runStateT instance Functor f => Functor (WriterT w f) where gmap f = WriterT . gmap (f *** id) . runWriterT++newtype Op1 b a = Op1 { op1 :: a -> b }+newtype Op2 b a = Op2 { op2 :: a -> a -> b }++instance Category Op1 where+    id = Op1 id+    Op1 f . Op1 g = Op1 (g . f)++instance Semigroup a => Semigroup (Op1 a b) where+    Op1 f <> Op1 g = Op1 (liftA2 (<>) f g)++instance (Semigroup a, Monoid a) => Monoid (Op1 a b) where+    mempty = Op1 (pure mempty)+    mappend = (<>)++instance Semigroup a => Semigroup (Op2 a b) where+    Op2 f <> Op2 g = Op2 ((liftA2 . liftA2) (<>) f g)++instance (Semigroup a, Monoid a) => Monoid (Op2 a b) where+    mempty = Op2 ((pure . pure) mempty)+    mappend = (<>)
Data/Profunctor.hs view
@@ -1,10 +1,18 @@+{-# LANGUAGE MultiParamTypeClasses, FlexibleContexts, FlexibleInstances #-}+{-# LANGUAGE DefaultSignatures #-}+ module Data.Profunctor where  import Prelude hiding ((.), id) +import Control.Applicative import Control.Arrow (Kleisli (..)) import Control.Category+import Control.Comonad import Control.Monad+import Control.Monad.Fix+import Data.Bifunctor.Braided+import Data.Cotraversable  class Profunctor p where     dimap :: (a -> b) -> (c -> d) -> p b c -> p a d@@ -16,8 +24,101 @@     rmap :: (b -> c) -> p a b -> p a c     rmap g = dimap id g +infixr 1 ^>>, >>^, <<^, ^<<++(^>>) :: Profunctor p => (a -> b) -> p b c -> p a c+(^>>) = lmap++(>>^) :: Profunctor p => p a b -> (b -> c) -> p a c+(>>^) = flip rmap++(<<^) :: Profunctor p => p b c -> (a -> b) -> p a c+(<<^) = flip lmap++(^<<) :: Profunctor p => (b -> c) -> p a b -> p a c+(^<<) = rmap+ instance Profunctor (->) where     dimap f g a = g . a . f -instance Monad m => Profunctor (Kleisli m) where+instance Functor f => Profunctor (Kleisli f) where     dimap f g (Kleisli a) = Kleisli (fmap g . a . f)++instance Functor f => Profunctor (Cokleisli f) where+    dimap f g (Cokleisli a) = Cokleisli (g . a . fmap f)++class Profunctor p => Strong f p where+    strong :: p a₁ b₁ -> p a₂ b₂ -> p (f a₁ a₂) (f b₁ b₂)++infixr 3 ***, &&&++(***) :: Strong (,) p => p a₁ b₁ -> p a₂ b₂ -> p (a₁, a₂) (b₁, b₂)+(***) = strong++(&&&) :: Strong (,) p => p a b₁ -> p a b₂ -> p a (b₁, b₂)+f &&& g = f *** g <<^ join (,)++infixr 2 +++, |||++(+++) :: Strong Either p => p a₁ b₁ -> p a₂ b₂ -> p (Either a₁ a₂) (Either b₁ b₂)+(+++) = strong++(|||) :: Strong Either p => p a₁ b -> p a₂ b -> p (Either a₁ a₂) b+f ||| g = either id id ^<< f +++ g++instance Strong (,) (->) where strong f g (x, y) = (f x, g y)++instance Applicative p => Strong (,) (Kleisli p) where+    strong (Kleisli f) (Kleisli g) = Kleisli $ \ (x, y) -> liftA2 (,) (f x) (g y)++instance Strong Either (->) where+    strong f _ (Left x)  = Left (f x)+    strong _ g (Right y) = Right (g y)++instance Functor f => Strong Either (Kleisli f) where+    strong (Kleisli f) (Kleisli g) = Kleisli $ \ case Left  x -> Left  <$> f x+                                                      Right y -> Right <$> g y++instance Comonad ɯ => Strong Either (Cokleisli ɯ) where+    strong (Cokleisli f) (Cokleisli g) =+        (\ a -> Left  . f . (a <$)) |||+        (\ a -> Right . g . (a <$)) ^>> Cokleisli (copure <*> void)+++class Profunctor p => Costrong f p where+    costrongL :: p (f a c) (f b c) -> p a b+    costrongR :: p (f a b) (f a c) -> p b c++    default costrongL :: Braided f => p (f a c) (f b c) -> p a b+    costrongL = costrongR . dimap braid braid++    default costrongR :: Braided f => p (f a b) (f a c) -> p b c+    costrongR = costrongL . dimap braid braid++instance Costrong (,) (->) where+    costrongL f a = let (b, c) = f (a, c) in b++instance MonadFix m => Costrong (,) (Kleisli m) where+    costrongL (Kleisli f) = Kleisli $ \ a -> fst <$> mfix (f . (,) a . snd)++instance Costrong Either (->) where+    costrongL f = let go = either id (go . f . Right) in go . f . Left++instance Monad m => Costrong Either (Kleisli m) where+    costrongL (Kleisli f) = let go = either pure (go <=< f . Right) in Kleisli (go <=< f . Left)++instance Functor f => Costrong Either (Cokleisli f) where+    costrongL (Cokleisli f) = Cokleisli (go . fmap Left)+      where go ɯ = case f ɯ of Left  b -> b+                               Right c -> go (Right c <$ ɯ)++class Profunctor p => Closed f p where+    closed :: p a b -> p (f a) (f b)++instance Functor f => Closed f (->) where closed = fmap++instance (Traversable f, Applicative p) => Closed f (Kleisli p) where+    closed = Kleisli . traverse . runKleisli++instance (Cotraversable f, Functor ɯ) => Closed f (Cokleisli ɯ) where+    closed = Cokleisli . cotraverse . runCokleisli
hs-functors.cabal view
@@ -1,5 +1,5 @@ name:                hs-functors-version:             0.1.0.0+version:             0.1.1.0 synopsis:            Functors from products of Haskell and its dual to Haskell -- description:          license:             BSD3@@ -12,13 +12,24 @@ cabal-version:       >=1.10  library-  exposed-modules:     Data.Functor.Contravariant-  exposed-modules:     Data.Profunctor+  exposed-modules:     Control.Comonad+                     , Control.Comonad.Trans.Class+                     , Control.Monad.Morph+                     , Control.Monad.Trans.Compose+                     , Data.Bifunctor.Braided+                     , Data.Cotraversable+                     , Data.Functor.Contravariant+                     , Data.Profunctor   -- other-modules:          -- other-extensions:    -  build-depends:       base >=4.9 && <4.12+  build-depends:       base >=4.9 && <5                      , transformers >=0.4.2 && <0.6   -- hs-source-dirs:         default-language:    Haskell2010-  default-extensions:  StandaloneDeriving+  default-extensions:  LambdaCase+                     , UnicodeSyntax+                     , PolyKinds+                     , StandaloneDeriving                      , GeneralizedNewtypeDeriving+                     , DeriveFunctor, DeriveFoldable, DeriveTraversable+  ghc-options:         -Wall -Wno-name-shadowing