packages feed

kan-extensions 3.6 → 3.6.2

raw patch · 6 files changed

+165/−9 lines, 6 filesPVP ok

version bump matches the API change (PVP)

API changes (from Hackage documentation)

+ Data.Functor.Contravariant.Yoneda: Yoneda :: (forall r. (r -> a) -> f r) -> Yoneda f a
+ Data.Functor.Contravariant.Yoneda: instance Adjunction f g => Adjunction (Yoneda f) (Yoneda g)
+ Data.Functor.Contravariant.Yoneda: instance Coindexed f => Coindexed (Yoneda f)
+ Data.Functor.Contravariant.Yoneda: instance Contravariant (Yoneda f)
+ Data.Functor.Contravariant.Yoneda: instance Representable f => Representable (Yoneda f)
+ Data.Functor.Contravariant.Yoneda: instance Valued f => Valued (Yoneda f)
+ Data.Functor.Contravariant.Yoneda: liftYoneda :: Contravariant f => f a -> Yoneda f a
+ Data.Functor.Contravariant.Yoneda: lowerYoneda :: Yoneda f a -> f a
+ Data.Functor.Contravariant.Yoneda: newtype Yoneda f a
+ Data.Functor.Contravariant.Yoneda: runYoneda :: Yoneda f a -> forall r. (r -> a) -> f r
+ Data.Functor.Yoneda: ranToYoneda :: Ran Identity f a -> Yoneda f a
+ Data.Functor.Yoneda: riftToYoneda :: Rift Identity f a -> Yoneda f a
+ Data.Functor.Yoneda: yonedaToRan :: Yoneda f a -> Ran Identity f a
+ Data.Functor.Yoneda: yonedaToRift :: Yoneda f a -> Rift Identity f a
+ Data.Functor.Yoneda.Reduction: lanToYoneda :: Lan Identity f a -> Yoneda f a
+ Data.Functor.Yoneda.Reduction: liftToYoneda :: Functor f => Lift Identity f a -> Yoneda f a
+ Data.Functor.Yoneda.Reduction: yonedaToLan :: Yoneda f a -> Lan Identity f a
+ Data.Functor.Yoneda.Reduction: yonedaToLift :: Yoneda f a -> Lift Identity f a

Files

CHANGELOG.markdown view
@@ -1,3 +1,11 @@+3.6.2+-----+* Added `Data.Functor.Contravariant.Yoneda` to complete the set of Yoneda embeddings/reductions.++3.6.1+-----+* Added several missing isomorphisms+ 3.6 --- * `instance Monad m => MonadSpec (Yoneda m)`
kan-extensions.cabal view
@@ -1,6 +1,6 @@ name:          kan-extensions category:      Data Structures, Monads, Comonads, Functors-version:       3.6+version:       3.6.2 license:       BSD3 cabal-version: >= 1.6 license-file:  LICENSE@@ -62,6 +62,7 @@     Control.Comonad.Density     Control.Monad.Co     Control.Monad.Codensity+    Data.Functor.Contravariant.Yoneda     Data.Functor.Contravariant.Yoneda.Reduction     Data.Functor.Kan.Lan     Data.Functor.Kan.Lift
+ src/Data/Functor/Contravariant/Yoneda.hs view
@@ -0,0 +1,69 @@+{-# LANGUAGE CPP #-}+{-# LANGUAGE GADTs #-}+{-# LANGUAGE TypeFamilies #-}+{-# LANGUAGE MultiParamTypeClasses #-}+{-# LANGUAGE Rank2Types #-}+{-# LANGUAGE UndecidableInstances #-}+#if defined(__GLASGOW_HASKELL__) && __GLASGOW_HASKELL__ >= 702+{-# LANGUAGE Trustworthy #-}+#endif+-----------------------------------------------------------------------------+-- |+-- Copyright   :  (C) 2013 Edward Kmett+-- License     :  BSD-style (see the file LICENSE)+--+-- Maintainer  :  Edward Kmett <ekmett@gmail.com>+-- Stability   :  provisional+-- Portability :  GADTs, TFs, MPTCs+--+----------------------------------------------------------------------------+module Data.Functor.Contravariant.Yoneda+  ( Yoneda(..)+  , liftYoneda, lowerYoneda+  ) where++import Data.Functor.Contravariant+import Data.Functor.Contravariant.Adjunction+import Data.Functor.Contravariant.Representable++-- | Yoneda embedding for a presheaf+newtype Yoneda f a = Yoneda { runYoneda :: forall r. (r -> a) -> f r }++-- |+--+-- @+-- 'liftYoneda' . 'lowerYoneda' ≡ 'id'+-- 'lowerYoneda' . 'liftYoneda' ≡ 'id'+-- @++liftYoneda :: Contravariant f => f a -> Yoneda f a+liftYoneda fa = Yoneda $ \ra -> contramap ra fa+{-# INLINE liftYoneda #-}++lowerYoneda :: Yoneda f a -> f a+lowerYoneda f = runYoneda f id+{-# INLINE lowerYoneda #-}++instance Contravariant (Yoneda f) where+  contramap ab (Yoneda m) = Yoneda (m . fmap ab)+  {-# INLINE contramap #-}++type instance Value (Yoneda f) = Value f++instance Valued f => Valued (Yoneda f) where+  contramapWithValue beav = liftYoneda . contramapWithValue beav . lowerYoneda+  {-# INLINE contramapWithValue #-}++instance Coindexed f => Coindexed (Yoneda f) where+  coindex m a = coindex (lowerYoneda m) a+  {-# INLINE coindex #-}++instance Representable f => Representable (Yoneda f) where+  contrarep = liftYoneda . contrarep+  {-# INLINE contrarep #-}++instance Adjunction f g => Adjunction (Yoneda f) (Yoneda g) where+  leftAdjunct f = liftYoneda . leftAdjunct (lowerYoneda . f)+  {-# INLINE leftAdjunct #-}+  rightAdjunct f = liftYoneda . rightAdjunct (lowerYoneda . f)+  {-# INLINE rightAdjunct #-}
src/Data/Functor/Contravariant/Yoneda/Reduction.hs view
@@ -60,6 +60,11 @@   {-# INLINE rightAdjunct #-}  -- | Yoneda "expansion" of a presheaf+--+-- @+-- 'liftYoneda' . 'lowerYoneda' ≡ 'id'+-- 'lowerYoneda' . 'liftYoneda' ≡ 'id'+-- @ liftYoneda :: f a -> Yoneda f a liftYoneda = Yoneda id {-# INLINE liftYoneda #-}
src/Data/Functor/Yoneda.hs view
@@ -33,9 +33,12 @@  module Data.Functor.Yoneda   ( Yoneda(..)-  , liftYoneda-  , lowerYoneda+  , liftYoneda, lowerYoneda   , maxF, minF, maxM, minM+  -- * as a right Kan extension+  , yonedaToRan, ranToYoneda+  -- * as a right Kan lift+  , yonedaToRift, riftToYoneda   ) where  import Control.Applicative@@ -50,10 +53,13 @@ import Data.Distributive import Data.Foldable import Data.Function (on)-import Data.Functor.Plus+import Data.Functor.Adjunction import Data.Functor.Bind import Data.Functor.Extend-import Data.Functor.Adjunction+import Data.Functor.Identity+import Data.Functor.Kan.Ran+import Data.Functor.Kan.Rift+import Data.Functor.Plus import Data.Functor.Representable import Data.Key import Data.Semigroup.Foldable@@ -80,6 +86,38 @@  {-# RULES "lower/lift=id" liftYoneda . lowerYoneda = id #-} {-# RULES "lift/lower=id" lowerYoneda . liftYoneda = id #-}++-- | @Yoneda f@ is the right Kan extension of @f@ along the 'Identity' functor.+--+-- @+-- 'yonedaToRan' . 'ranToYoneda' ≡ 'id'+-- 'ranToYoneda' . 'yonedaToRan' ≡ 'id'+-- @+yonedaToRan :: Yoneda f a -> Ran Identity f a+yonedaToRan (Yoneda m) = Ran (m . fmap runIdentity)++ranToYoneda :: Ran Identity f a -> Yoneda f a+ranToYoneda (Ran m) = Yoneda (m . fmap Identity)++{-# RULES "yonedaToRan/ranToYoneda=id" yonedaToRan . ranToYoneda = id #-}+{-# RULES "ranToYoneda/yonedaToRan=id" ranToYoneda . yonedaToRan = id #-}++-- | @Yoneda f@ is the right Kan lift of @f@ along the 'Identity' functor.+--+-- @+-- 'yonedaToRift' . 'riftToYoneda' ≡ 'id'+-- 'riftToYoneda' . 'yonedaToRift' ≡ 'id'+-- @+yonedaToRift :: Yoneda f a -> Rift Identity f a+yonedaToRift m = Rift (runYoneda m . runIdentity)+{-# INLINE yonedaToRift #-}++riftToYoneda :: Rift Identity f a -> Yoneda f a+riftToYoneda m = Yoneda (runRift m . Identity)+{-# INLINE riftToYoneda #-}++{-# RULES "yonedaToRift/riftToYoneda=id" yonedaToRift . riftToYoneda = id #-}+{-# RULES "riftToYoneda/yonedaToRift=id" riftToYoneda . yonedaToRift = id #-}  instance Functor (Yoneda f) where   fmap f m = Yoneda (\k -> runYoneda m (k . f))
src/Data/Functor/Yoneda/Reduction.hs view
@@ -26,9 +26,11 @@ ---------------------------------------------------------------------------- module Data.Functor.Yoneda.Reduction   ( Yoneda(..)-  , liftYoneda-  , lowerYoneda-  , lowerM+  , liftYoneda, lowerYoneda, lowerM+  -- * as a Left Kan extension+  , yonedaToLan, lanToYoneda+  -- * as a Left Kan lift+  , yonedaToLift, liftToYoneda   ) where  import Control.Applicative@@ -39,10 +41,13 @@ import Control.Comonad.Trans.Class import Data.Distributive import Data.Function (on)+import Data.Functor.Adjunction import Data.Functor.Bind import Data.Functor.Extend+import Data.Functor.Identity+import Data.Functor.Kan.Lan+import Data.Functor.Kan.Lift import Data.Functor.Plus-import Data.Functor.Adjunction import Data.Functor.Representable import Data.Key import Data.Foldable@@ -55,6 +60,36 @@ -- | A form suitable for Yoneda reduction data Yoneda f a where   Yoneda :: (b -> a) -> f b -> Yoneda f a++-- | @Yoneda f@ is the left Kan extension of @f@ along the 'Identity' functor.+--+-- @+-- 'yonedaToLan' . 'lanToYoneda' ≡ 'id'+-- 'lanToYoneda' . 'yonedaToLan' ≡ 'id'+-- @+yonedaToLan :: Yoneda f a -> Lan Identity f a+yonedaToLan (Yoneda ba fb) = Lan (ba . runIdentity) fb++lanToYoneda :: Lan Identity f a -> Yoneda f a+lanToYoneda (Lan iba fb) = Yoneda (iba . Identity) fb++{-# RULES "yonedaToLan/lanToYoneda=id" yonedaToLan . lanToYoneda = id #-}+{-# RULES "lanToYoneda/yonedaToLan=id" lanToYoneda . yonedaToLan = id #-}++-- | @Yoneda f@ is the left Kan lift of @f@ along the 'Identity' functor.+--+-- @+-- 'yonedaToLift' . 'liftToYoneda' ≡ 'id'+-- 'liftToYoneda' . 'yonedaToLift' ≡ 'id'+-- @+yonedaToLift :: Yoneda f a -> Lift Identity f a+yonedaToLift (Yoneda ba fb) = Lift $ \ f2iz -> ba <$> runIdentity (f2iz fb)++liftToYoneda :: Functor f => Lift Identity f a -> Yoneda f a+liftToYoneda (Lift m) = Yoneda id (m Identity)++{-# RULES "yonedaToLift/liftToYoneda=id" yonedaToLift . liftToYoneda = id #-}+{-# RULES "liftToYoneda/yonedaToLift=id" liftToYoneda . yonedaToLift = id #-}  instance Functor (Yoneda f) where   fmap f (Yoneda g v) = Yoneda (f . g) v