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 +70/−0
- Control/Comonad/Trans/Class.hs +9/−0
- Control/Monad/Morph.hs +46/−0
- Control/Monad/Trans/Compose.hs +20/−0
- Data/Bifunctor/Braided.hs +8/−0
- Data/Cotraversable.hs +50/−0
- Data/Functor/Contravariant.hs +25/−7
- Data/Profunctor.hs +102/−1
- hs-functors.cabal +16/−5
+ 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