semigroupoid-extras 0.2.5 → 0.2.6
raw patch · 4 files changed
+63/−6 lines, 4 files
Files
- Data/Semifunctor.hs +2/−0
- Data/Semifunctor/Associative.hs +3/−5
- Data/Semifunctor/Braided.hs +56/−0
- semigroupoid-extras.cabal +2/−1
Data/Semifunctor.hs view
@@ -93,6 +93,8 @@ instance Extend w => Semifunctor (Bi (,)) (Product (Cokleisli w) (Cokleisli w)) (Cokleisli w) where semimap (Pair l r) = Cokleisli $ \p -> runCokleisli l (fstP <$> p) # runCokleisli r (sndP <$> p) +-- instance Extend w => Semifunctor (Bi Either)) (Product (Cokleisli w) (Cokleisli w)) (Cokleisli w) where+ semibimap :: Semifunctor p (Product l r) cod => l a b -> r c d -> cod (p (a,c)) (p (b,d)) semibimap f g = semimap (Pair f g)
Data/Semifunctor/Associative.hs view
@@ -1,4 +1,4 @@-{-# LANGUAGE MultiParamTypeClasses, FlexibleContexts, FlexibleInstances, GADTs, ImplicitParams #-}+{-# LANGUAGE MultiParamTypeClasses, FlexibleContexts, FlexibleInstances, GADTs #-} module Data.Semifunctor.Associative where import Prelude hiding ((.), id)@@ -6,11 +6,7 @@ import Control.Comonad import Data.Functor.Bind import Data.Semifunctor--- import Data.Semigroupoid.Dual--- import Data.Semigroupoid.Product --- instance Semifunctor p (Product x y) z => Semifunctor (DualSemibifunctor p) (Product (Dual x) (Dual y)) (Dual z) where- class Semifunctor p (Product k k) k => Associative k p where associate :: k (p(p(a,b),c)) (p(a,p(b,c))) @@ -36,6 +32,8 @@ instance Comonad m => Associative (Cokleisli m) (Bi (,)) where associate = cokleisliAssociate++-- instance Comonad m => Associative (Cokleisli m) (Bi Either) where associate = cokleisliAssociate -- instance Disassociative k p => Associative (Dual k) p -- instance (Monad m, Semifunctor p (Product (Kleisli m) (Kleisli m) (Kleisli m), Associative (->) p) => Associative (Kleisli m) p) where associate = kleisliAssociate
+ Data/Semifunctor/Braided.hs view
@@ -0,0 +1,56 @@+{-# LANGUAGE MultiParamTypeClasses, FlexibleContexts, FlexibleInstances, GADTs #-}+module Data.Semifunctor.Braided + ( Braided(..)+ , kleisliBraid+ , cokleisliBraid+ , Symmetric+ , swap+ ) where++import Prelude hiding ((.), id)+import Control.Arrow+import Control.Comonad+import Data.Functor.Bind+import Data.Semifunctor+import Data.Semifunctor.Associative+-- import Data.Semigroupoid.Dual++class Associative k p => Braided k p where+ braid :: k (p(a,b)) (p(b,a))++-- instance Braided k p => Braided (Dual k) p where braid = Dual braid++instance Braided (->) (Bi Either) where+ braid (Bi (Left a)) = Bi (Right a)+ braid (Bi (Right a)) = Bi (Left a)++instance Braided (->) (Bi (,)) where+ braid (Bi (a,b)) = Bi (b,a)++kleisliBraid :: (Monad m, Semifunctor p (Product (Kleisli m) (Kleisli m)) (Kleisli m), Braided (->) p) => Kleisli m (p(a,b)) (p(b,a))+kleisliBraid = Kleisli (return . braid)++instance (Bind m, Monad m) => Braided (Kleisli m) (Bi Either) where+ braid = kleisliBraid++instance (Bind m, Monad m) => Braided (Kleisli m) (Bi (,)) where+ braid = kleisliBraid++cokleisliBraid :: (Comonad w, Semifunctor p (Product (Cokleisli w) (Cokleisli w)) (Cokleisli w), Braided (->) p) => Cokleisli w (p(a,b)) (p(b,a))+cokleisliBraid = Cokleisli (braid . extract)++instance Comonad w => Braided (Cokleisli w) (Bi (,)) where+ braid = cokleisliBraid++-- instance Comonad w => Braided (Cokleisli w) (Bi Either) where braid = cokleisliBraid++class Braided k p => Symmetric k p+instance Symmetric (->) (Bi Either) +instance Symmetric (->) (Bi (,))+instance (Bind m, Monad m) => Symmetric (Kleisli m) (Bi Either)+instance (Bind m, Monad m) => Symmetric (Kleisli m) (Bi (,))+instance Comonad w => Symmetric (Cokleisli w) (Bi (,))+-- instance Comonad w => Symmetric (Cokleisli w) (Bi Either)++swap :: Symmetric k p => k (p(a,b)) (p(b,a))+swap = braid
semigroupoid-extras.cabal view
@@ -1,6 +1,6 @@ name: semigroupoid-extras category: Control-version: 0.2.5+version: 0.2.6 license: BSD3 cabal-version: >= 1.6 license-file: LICENSE@@ -28,6 +28,7 @@ exposed-modules: Data.Semifunctor Data.Semifunctor.Associative+ Data.Semifunctor.Braided Data.Semigroupoid.Ob Data.Semigroupoid.Product Data.Semigroupoid.Coproduct