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 +83/−0
- LICENSE +30/−0
- README.md +1/−0
- Setup.hs +2/−0
- hs-profunctors.cabal +43/−0
+ 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