packages feed

hs-profunctors (empty) → 0.1.0.0

raw patch · 5 files changed

+159/−0 lines, 5 filesdep +basedep +hs-functorssetup-changed

Dependencies added: base, hs-functors

Files

+ Data/Profunctor.hs view
@@ -0,0 +1,83 @@+{-# LANGUAGE MultiParamTypeClasses, FlexibleContexts, FlexibleInstances #-}+{-# LANGUAGE DefaultSignatures #-}++module Data.Profunctor where++import Prelude hiding ((.), id)++import Control.Arrow (Kleisli (..), (|||))+import Control.Category+import Control.Comonad+import Control.Monad+import Control.Monad.Fix+import Data.Cotraversable++class Profunctor p where+    dimap :: (a -> b) -> (c -> d) -> p b c -> p a d+    dimap f g = lmap f . rmap g++    lmap :: (a -> b) -> p b c -> p a c+    lmap f = dimap f id++    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 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 => Related f p where+    relate :: p a b -> p (f a) (f b)++instance Functor f => Related f (->) where relate = fmap++instance (Applicative p, Traversable f) => Related f (Kleisli p) where+    relate = Kleisli . traverse . runKleisli++instance (Cotraversable f, Functor ɯ) => Related f (Cokleisli ɯ) where+    relate = Cokleisli . cotraverse . runCokleisli++instance {-# OVERLAPPING #-} Comonad ɯ => Related (Either a) (Cokleisli ɯ) where+    relate (Cokleisli f) =+        (\ a -> Left . copure . (a <$)) |||+        (\ a -> Right . f     . (a <$)) ^>> Cokleisli (copure <*> void)+++class Profunctor p => Corelated f p where+    corelate :: p (f a) (f b) -> p a b++instance Corelated ((,) a) (->) where+    corelate f a = let (c, b) = f (c, a) in b++instance MonadFix m => Corelated ((,) a) (Kleisli m) where+    corelate (Kleisli f) = Kleisli $ \ a -> snd <$> mfix (f . flip (,) a . fst)++instance Corelated (Either a) (->) where+    corelate f = let go = either (go . f . Left) id in go . f . Right++instance Monad m => Corelated (Either a) (Kleisli m) where+    corelate (Kleisli f) = let go = either (go <=< f . Left) pure in Kleisli (go <=< f . Right)++instance Functor f => Corelated (Either a) (Cokleisli f) where+    corelate (Cokleisli f) = Cokleisli (go . fmap Right)+      where go ɯ = case f ɯ of Right b -> b+                               Left  c -> go (Left c <$ ɯ)
+ LICENSE view
@@ -0,0 +1,30 @@+Copyright M Farkas-Dyck © 2019++All rights reserved.++Redistribution and use in source and binary forms, with or without+modification, are permitted provided that the following conditions are met:++    * Redistributions of source code must retain the above copyright+      notice, this list of conditions and the following disclaimer.++    * Redistributions in binary form must reproduce the above+      copyright notice, this list of conditions and the following+      disclaimer in the documentation and/or other materials provided+      with the distribution.++    * Neither the name of M Farkas-Dyck nor the names of other+      contributors may be used to endorse or promote products derived+      from this software without specific prior written permission.++THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS+"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT+LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR+A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT+OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,+SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT+LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,+DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY+THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT+(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE+OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ README.md view
@@ -0,0 +1,1 @@+# hs-profunctors
+ Setup.hs view
@@ -0,0 +1,2 @@+import Distribution.Simple+main = defaultMain
+ hs-profunctors.cabal view
@@ -0,0 +1,43 @@+name:                hs-profunctors+version:             0.1.0.0+synopsis:            Profunctors from Haskell to Haskell+-- description:+license:             BSD3+license-file:        LICENSE+author:              M Farkas-Dyck+maintainer:          strake888@gmail.com+copyright:           2019 M Farkas-Dyck+-- category:            +build-type:          Simple+extra-source-files:  README.md+cabal-version:       >=1.10++library+  hs-source-dirs:      .+  exposed-modules:     Data.Profunctor+  build-depends:       base >= 4.7 && < 5+                     , hs-functors >= 0.1 && < 0.2+  default-language:    Haskell2010+  default-extensions:  UnicodeSyntax+                     , LambdaCase+                     , EmptyCase+                     , InstanceSigs+                     , PartialTypeSignatures+                     , PolyKinds+                     , ConstraintKinds+                     , FlexibleContexts+                     , FlexibleInstances+                     , MonadComprehensions+                     , StandaloneDeriving+                     , DeriveFunctor, DeriveFoldable, DeriveTraversable+  ghc-options:         -Wall -Wcompat -Wredundant-constraints -Wno-name-shadowing+                       -Wincomplete-record-updates -Wincomplete-uni-patterns+                       -Werror=incomplete-patterns+                       -Werror=incomplete-uni-patterns+                       -Werror=incomplete-record-updates+                       -Werror=missing-fields+                       -Werror=missing-methods++source-repository head+  type:     git+  location: https://github.com/strake/hs-profunctors.hs