Hello community, here is the log from the commit of package ghc-kan-extensions for openSUSE:Factory checked in at 2016-10-24 14:44:20 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ Comparing /work/SRC/openSUSE:Factory/ghc-kan-extensions (Old) and /work/SRC/openSUSE:Factory/.ghc-kan-extensions.new (New) ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Package is "ghc-kan-extensions" Changes: -------- --- /work/SRC/openSUSE:Factory/ghc-kan-extensions/ghc-kan-extensions.changes 2016-07-20 09:21:21.000000000 +0200 +++ /work/SRC/openSUSE:Factory/.ghc-kan-extensions.new/ghc-kan-extensions.changes 2016-10-24 14:44:20.000000000 +0200 @@ -1,0 +2,5 @@ +Thu Sep 15 06:49:57 UTC 2016 - psim...@suse.com + +- Update to version 5.0.1 revision 0 with cabal2obs. + +------------------------------------------------------------------- Old: ---- kan-extensions-4.2.3.tar.gz New: ---- kan-extensions-5.0.1.tar.gz ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ Other differences: ------------------ ++++++ ghc-kan-extensions.spec ++++++ --- /var/tmp/diff_new_pack.oSmDGC/_old 2016-10-24 14:44:21.000000000 +0200 +++ /var/tmp/diff_new_pack.oSmDGC/_new 2016-10-24 14:44:21.000000000 +0200 @@ -18,15 +18,14 @@ %global pkg_name kan-extensions Name: ghc-%{pkg_name} -Version: 4.2.3 +Version: 5.0.1 Release: 0 Summary: Kan extensions, Kan lifts, various forms of the Yoneda lemma, and (co)density (co)monads License: BSD-3-Clause -Group: System/Libraries +Group: Development/Languages/Other Url: https://hackage.haskell.org/package/%{pkg_name} Source0: https://hackage.haskell.org/package/%{pkg_name}-%{version}/%{pkg_name}-%{version}.tar.gz BuildRequires: ghc-Cabal-devel -# Begin cabal-rpm deps: BuildRequires: ghc-adjunctions-devel BuildRequires: ghc-array-devel BuildRequires: ghc-comonad-devel @@ -40,7 +39,6 @@ BuildRequires: ghc-tagged-devel BuildRequires: ghc-transformers-devel BuildRoot: %{_tmppath}/%{name}-%{version}-build -# End cabal-rpm deps %description Kan extensions, Kan lifts, various forms of the Yoneda lemma, and (co)density @@ -60,15 +58,12 @@ %prep %setup -q -n %{pkg_name}-%{version} - %build %ghc_lib_build - %install %ghc_lib_install - %post devel %ghc_pkg_recache ++++++ kan-extensions-4.2.3.tar.gz -> kan-extensions-5.0.1.tar.gz ++++++ diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/kan-extensions-4.2.3/.travis.yml new/kan-extensions-5.0.1/.travis.yml --- old/kan-extensions-4.2.3/.travis.yml 2015-09-14 01:13:30.000000000 +0200 +++ new/kan-extensions-5.0.1/.travis.yml 2016-01-17 03:35:52.000000000 +0100 @@ -13,12 +13,12 @@ matrix: include: - - env: CABALVER=1.16 GHCVER=7.4.2 + - env: CABALVER=1.18 GHCVER=7.4.2 compiler: ": #GHC 7.4.2" - addons: {apt: {packages: [cabal-install-1.16,ghc-7.4.2,alex-3.1.4,happy-1.19.5], sources: [hvr-ghc]}} - - env: CABALVER=1.16 GHCVER=7.6.3 + addons: {apt: {packages: [cabal-install-1.18,ghc-7.4.2,alex-3.1.4,happy-1.19.5], sources: [hvr-ghc]}} + - env: CABALVER=1.18 GHCVER=7.6.3 compiler: ": #GHC 7.6.3" - addons: {apt: {packages: [cabal-install-1.16,ghc-7.6.3,alex-3.1.4,happy-1.19.5], sources: [hvr-ghc]}} + addons: {apt: {packages: [cabal-install-1.18,ghc-7.6.3,alex-3.1.4,happy-1.19.5], sources: [hvr-ghc]}} - env: CABALVER=1.18 GHCVER=7.8.4 compiler: ": #GHC 7.8.4" addons: {apt: {packages: [cabal-install-1.18,ghc-7.8.4,alex-3.1.4,happy-1.19.5], sources: [hvr-ghc]}} @@ -28,6 +28,9 @@ - env: CABALVER=1.22 GHCVER=7.10.2 compiler: ": #GHC 7.10.2" addons: {apt: {packages: [cabal-install-1.22,ghc-7.10.2,alex-3.1.4,happy-1.19.5], sources: [hvr-ghc]}} + - env: CABALVER=1.24 GHCVER=8.0.1 + compiler: ": #GHC 8.0.1" + addons: {apt: {packages: [cabal-install-1.24,ghc-8.0.1,alex-3.1.4,happy-1.19.5], sources: [hvr-ghc]}} before_install: - unset CC diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/kan-extensions-4.2.3/CHANGELOG.markdown new/kan-extensions-5.0.1/CHANGELOG.markdown --- old/kan-extensions-4.2.3/CHANGELOG.markdown 2015-09-14 01:13:30.000000000 +0200 +++ new/kan-extensions-5.0.1/CHANGELOG.markdown 2016-01-17 03:35:53.000000000 +0100 @@ -1,3 +1,11 @@ +5.0.1 +----- +* Removed some redundant constraints + +5 +----- +* Move `Data.Functor.Kan.Rift` to `Data.Functor.Day.Curried` + 4.2.3 ----- * Builds clean on GHC 7.10 diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/kan-extensions-4.2.3/LICENSE new/kan-extensions-5.0.1/LICENSE --- old/kan-extensions-4.2.3/LICENSE 2015-09-14 01:13:30.000000000 +0200 +++ new/kan-extensions-5.0.1/LICENSE 2016-01-17 03:35:52.000000000 +0100 @@ -1,4 +1,4 @@ -Copyright 2008-2013 Edward Kmett +Copyright 2008-2016 Edward Kmett All rights reserved. diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/kan-extensions-4.2.3/kan-extensions.cabal new/kan-extensions-5.0.1/kan-extensions.cabal --- old/kan-extensions-4.2.3/kan-extensions.cabal 2015-09-14 01:13:30.000000000 +0200 +++ new/kan-extensions-5.0.1/kan-extensions.cabal 2016-01-17 03:35:52.000000000 +0100 @@ -1,6 +1,6 @@ name: kan-extensions category: Data Structures, Monads, Comonads, Functors -version: 4.2.3 +version: 5.0.1 license: BSD3 cabal-version: >= 1.6 license-file: LICENSE @@ -9,7 +9,7 @@ stability: provisional homepage: http://github.com/ekmett/kan-extensions/ bug-reports: http://github.com/ekmett/kan-extensions/issues -copyright: Copyright (C) 2008-2013 Edward A. Kmett +copyright: Copyright (C) 2008-2016 Edward A. Kmett synopsis: Kan extensions, Kan lifts, various forms of the Yoneda lemma, and (co)density (co)monads description: Kan extensions, Kan lifts, various forms of the Yoneda lemma, and (co)density (co)monads build-type: Simple @@ -43,7 +43,7 @@ adjunctions >= 4.2 && < 5, array >= 0.3.0.2 && < 0.6, base >= 4.4 && < 5, - comonad >= 4 && < 5, + comonad >= 4 && < 6, containers >= 0.4 && < 0.6, contravariant >= 1 && < 2, distributive >= 0.2.2 && < 1, @@ -51,7 +51,7 @@ mtl >= 2.0.1 && < 2.3, semigroupoids >= 4 && < 6, tagged >= 0.7.2 && < 1, - transformers >= 0.2 && < 0.5 + transformers >= 0.2 && < 0.6 exposed-modules: Control.Comonad.Density @@ -61,10 +61,9 @@ Data.Functor.Contravariant.Yoneda Data.Functor.Contravariant.Coyoneda Data.Functor.Day + Data.Functor.Day.Curried Data.Functor.Kan.Lan - Data.Functor.Kan.Lift Data.Functor.Kan.Ran - Data.Functor.Kan.Rift Data.Functor.Yoneda Data.Functor.Coyoneda diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/kan-extensions-4.2.3/src/Control/Comonad/Density.hs new/kan-extensions-5.0.1/src/Control/Comonad/Density.hs --- old/kan-extensions-4.2.3/src/Control/Comonad/Density.hs 2015-09-14 01:13:30.000000000 +0200 +++ new/kan-extensions-5.0.1/src/Control/Comonad/Density.hs 2016-01-17 03:35:52.000000000 +0100 @@ -7,7 +7,7 @@ ----------------------------------------------------------------------------- -- | -- Module : Control.Comonad.Density --- Copyright : (C) 2008-2011 Edward Kmett +-- Copyright : (C) 2008-2016 Edward Kmett -- License : BSD-style (see the file LICENSE) -- -- Maintainer : Edward Kmett <ekm...@gmail.com> diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/kan-extensions-4.2.3/src/Control/Monad/Co.hs new/kan-extensions-5.0.1/src/Control/Monad/Co.hs --- old/kan-extensions-4.2.3/src/Control/Monad/Co.hs 2015-09-14 01:13:30.000000000 +0200 +++ new/kan-extensions-5.0.1/src/Control/Monad/Co.hs 2016-01-17 03:35:52.000000000 +0100 @@ -9,7 +9,7 @@ #endif ----------------------------------------------------------------------------- -- | --- Copyright : (C) 2011 Edward Kmett +-- Copyright : (C) 2011-2016 Edward Kmett -- License : BSD-style (see the file LICENSE) -- -- Maintainer : Edward Kmett <ekm...@gmail.com> @@ -83,7 +83,7 @@ -- | -- @ --- 'Co' w a ~ 'Data.Functor.KanLift.Rift' w 'Identity' a +-- 'Co' w a ~ 'Data.Functor.Kan.Rift.Rift' w 'Identity' a -- @ newtype CoT w m a = CoT { runCoT :: forall r. w (a -> m r) -> m r } @@ -101,7 +101,7 @@ mf <*> ma = mf >>= \f -> fmap f ma instance Comonad w => Monad (CoT w m) where - return a = CoT (`extract` a) + return = pure CoT k >>= f = CoT (k . extend (\wa a -> runCoT (f a) wa)) instance Comonad w => MonadTrans (CoT w) where @@ -128,22 +128,22 @@ lowerCo1 :: Functor w => Co w () -> w a -> a lowerCo1 m = runIdentity . runCoT m . fmap (const . return) -posW :: (ComonadStore s w, Monad m) => CoT w m s +posW :: ComonadStore s w => CoT w m s posW = liftCoT0 pos -peekW :: (ComonadStore s w, Monad m) => s -> CoT w m () +peekW :: ComonadStore s w => s -> CoT w m () peekW s = liftCoT1 (peek s) -peeksW :: (ComonadStore s w, Monad m) => (s -> s) -> CoT w m () +peeksW :: ComonadStore s w => (s -> s) -> CoT w m () peeksW f = liftCoT1 (peeks f) -askW :: (ComonadEnv e w, Monad m) => CoT w m e +askW :: ComonadEnv e w => CoT w m e askW = liftCoT0 (Env.ask) -asksW :: (ComonadEnv e w, Monad m) => (e -> a) -> CoT w m a +asksW :: ComonadEnv e w => (e -> a) -> CoT w m a asksW f = liftCoT0 (Env.asks f) -traceW :: (ComonadTraced e w, Monad m) => e -> CoT w m () +traceW :: ComonadTraced e w => e -> CoT w m () traceW e = liftCoT1 (Traced.trace e) liftCoT0M :: (Comonad w, Monad m) => (forall a. w a -> m s) -> CoT w m s @@ -155,7 +155,7 @@ diter :: Functor f => a -> (a -> f a) -> Density (Cofree f) a diter x y = liftDensity . coiter y $ x -dctrlM :: (Comonad w, Monad m) => (forall a. w a -> m (w a)) -> CoT (Density w) m () +dctrlM :: Monad m => (forall a. w a -> m (w a)) -> CoT (Density w) m () dctrlM k = liftCoT1M (\(Density w a) -> liftM w (k a)) instance (Comonad w, MonadReader e m) => MonadReader e (CoT w m) where diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/kan-extensions-4.2.3/src/Control/Monad/Codensity.hs new/kan-extensions-5.0.1/src/Control/Monad/Codensity.hs --- old/kan-extensions-4.2.3/src/Control/Monad/Codensity.hs 2015-09-14 01:13:30.000000000 +0200 +++ new/kan-extensions-5.0.1/src/Control/Monad/Codensity.hs 2016-01-17 03:35:52.000000000 +0100 @@ -3,17 +3,17 @@ {-# LANGUAGE FlexibleInstances #-} {-# LANGUAGE UndecidableInstances #-} {-# LANGUAGE MultiParamTypeClasses #-} -#if defined(__GLASGOW_HASKELL__) && __GLASGOW_HASKELL__ >= 702 +#if __GLASGOW_HASKELL__ >= 702 {-# LANGUAGE Trustworthy #-} #endif -#if defined(__GLASGOW_HASKELL__) && __GLASGOW_HASKELL__ >= 708 +#if __GLASGOW_HASKELL__ >= 708 {-# LANGUAGE DeriveDataTypeable #-} #endif ----------------------------------------------------------------------------- -- | -- Module : Control.Monad.Codensity --- Copyright : (C) 2008-2013 Edward Kmett +-- Copyright : (C) 2008-2016 Edward Kmett -- License : BSD-style (see the file LICENSE) -- -- Maintainer : Edward Kmett <ekm...@gmail.com> @@ -31,7 +31,7 @@ ) where import Control.Applicative -import Control.Monad (ap, MonadPlus(..)) +import Control.Monad (MonadPlus(..)) import Control.Monad.Free import Control.Monad.IO.Class import Control.Monad.Reader.Class @@ -42,7 +42,7 @@ import Data.Functor.Kan.Ran import Data.Functor.Plus import Data.Functor.Rep -#if defined(__GLASGOW_HASKELL__) && __GLASGOW_HASKELL__ >= 708 +#if __GLASGOW_HASKELL__ >= 708 import Data.Typeable #endif @@ -54,13 +54,13 @@ -- repeated applications of @(>>=)@. -- -- See \"Asymptotic Improvement of Computations over Free Monads\" by Janis --- Voightländer for more information about this type. +-- Voigtländer for more information about this type. -- -- <http://www.iai.uni-bonn.de/~jv/mpc08.pdf> newtype Codensity m a = Codensity { runCodensity :: forall b. (a -> m b) -> m b } -#if defined(__GLASGOW_HASKELL__) && __GLASGOW_HASKELL__ >= 708 +#if __GLASGOW_HASKELL__ >= 708 deriving Typeable #endif @@ -69,17 +69,17 @@ {-# INLINE fmap #-} instance Apply (Codensity f) where - (<.>) = ap + (<.>) = (<*>) {-# INLINE (<.>) #-} instance Applicative (Codensity f) where pure x = Codensity (\k -> k x) {-# INLINE pure #-} - (<*>) = ap + Codensity f <*> Codensity g = Codensity (\bfr -> f (\ab -> g (bfr . ab))) {-# INLINE (<*>) #-} instance Monad (Codensity f) where - return x = Codensity (\k -> k x) + return = pure {-# INLINE return #-} m >>= k = Codensity (\c -> runCodensity m (\a -> runCodensity (k a) c)) {-# INLINE (>>=) #-} @@ -116,11 +116,15 @@ Codensity m <|> Codensity n = Codensity (\k -> m k <|> n k) {-# INLINE (<|>) #-} +#if __GLASGOW_HASKELL__ >= 710 +instance Alternative v => MonadPlus (Codensity v) +#else instance MonadPlus v => MonadPlus (Codensity v) where mzero = Codensity (\_ -> mzero) {-# INLINE mzero #-} Codensity m `mplus` Codensity n = Codensity (\k -> m k `mplus` n k) {-# INLINE mplus #-} +#endif -- | -- This serves as the *left*-inverse (retraction) of 'lift'. @@ -136,8 +140,13 @@ -- e.g. @'Codensity' ((->) s)) a ~ forall r. (a -> s -> r) -> s -> r@ -- could support a full complement of @'MonadState' s@ actions, while @(->) s@ -- is limited to @'MonadReader' s@ actions. +#if __GLASGOW_HASKELL__ >= 710 +lowerCodensity :: Applicative f => Codensity f a -> f a +lowerCodensity a = runCodensity a pure +#else lowerCodensity :: Monad m => Codensity m a -> m a lowerCodensity a = runCodensity a return +#endif {-# INLINE lowerCodensity #-} -- | The 'Codensity' monad of a right adjoint is isomorphic to the diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/kan-extensions-4.2.3/src/Data/Functor/Contravariant/Coyoneda.hs new/kan-extensions-5.0.1/src/Data/Functor/Contravariant/Coyoneda.hs --- old/kan-extensions-4.2.3/src/Data/Functor/Contravariant/Coyoneda.hs 2015-09-14 01:13:30.000000000 +0200 +++ new/kan-extensions-5.0.1/src/Data/Functor/Contravariant/Coyoneda.hs 2016-01-17 03:35:52.000000000 +0100 @@ -10,7 +10,7 @@ ----------------------------------------------------------------------------- -- | --- Copyright : (C) 2013 Edward Kmett +-- Copyright : (C) 2013-2016 Edward Kmett -- License : BSD-style (see the file LICENSE) -- -- Maintainer : Edward Kmett <ekm...@gmail.com> diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/kan-extensions-4.2.3/src/Data/Functor/Contravariant/Day.hs new/kan-extensions-5.0.1/src/Data/Functor/Contravariant/Day.hs --- old/kan-extensions-4.2.3/src/Data/Functor/Contravariant/Day.hs 2015-09-14 01:13:30.000000000 +0200 +++ new/kan-extensions-5.0.1/src/Data/Functor/Contravariant/Day.hs 2016-01-17 03:35:52.000000000 +0100 @@ -13,7 +13,7 @@ #endif ----------------------------------------------------------------------------- -- | --- Copyright : (C) 2013-2014 Edward Kmett, Gershom Bazerman and Derek Elkins +-- Copyright : (C) 2013-2016 Edward Kmett, Gershom Bazerman and Derek Elkins -- License : BSD-style (see the file LICENSE) -- -- Maintainer : Edward Kmett <ekm...@gmail.com> diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/kan-extensions-4.2.3/src/Data/Functor/Contravariant/Yoneda.hs new/kan-extensions-5.0.1/src/Data/Functor/Contravariant/Yoneda.hs --- old/kan-extensions-4.2.3/src/Data/Functor/Contravariant/Yoneda.hs 2015-09-14 01:13:30.000000000 +0200 +++ new/kan-extensions-5.0.1/src/Data/Functor/Contravariant/Yoneda.hs 2016-01-17 03:35:52.000000000 +0100 @@ -9,7 +9,7 @@ #endif ----------------------------------------------------------------------------- -- | --- Copyright : (C) 2013 Edward Kmett +-- Copyright : (C) 2013-2016 Edward Kmett -- License : BSD-style (see the file LICENSE) -- -- Maintainer : Edward Kmett <ekm...@gmail.com> diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/kan-extensions-4.2.3/src/Data/Functor/Coyoneda.hs new/kan-extensions-5.0.1/src/Data/Functor/Coyoneda.hs --- old/kan-extensions-4.2.3/src/Data/Functor/Coyoneda.hs 2015-09-14 01:13:30.000000000 +0200 +++ new/kan-extensions-5.0.1/src/Data/Functor/Coyoneda.hs 2016-01-17 03:35:52.000000000 +0100 @@ -11,7 +11,7 @@ ----------------------------------------------------------------------------- -- | --- Copyright : (C) 2011-2013 Edward Kmett +-- Copyright : (C) 2011-2016 Edward Kmett -- License : BSD-style (see the file LICENSE) -- -- Maintainer : Edward Kmett <ekm...@gmail.com> @@ -26,8 +26,6 @@ , liftCoyoneda, lowerCoyoneda, lowerM -- * as a Left Kan extension , coyonedaToLan, lanToCoyoneda - -- * as a Left Kan lift - , coyonedaToLift, liftToCoyoneda ) where import Control.Applicative @@ -43,7 +41,6 @@ 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.Rep import Data.Foldable @@ -60,6 +57,15 @@ -- | @Coyoneda f@ is the left Kan extension of @f@ along the 'Identity' functor. -- +-- @Coyoneda f@ is always a functor, even if @f@ is not. In this case, it +-- is called the /free functor over @f@/. Note the following categorical fine +-- print: If @f@ is not a functor, @Coyoneda f@ is actually not the left Kan +-- extension of @f@ along the 'Identity' functor, but along the inclusion +-- functor from the discrete subcategory of /Hask/ which contains only identity +-- functions as morphisms to the full category /Hask/. (This is because @f@, +-- not being a proper functor, can only be interpreted as a categorical functor +-- by restricting the source category to only contain identities.) +-- -- @ -- 'coyonedaToLan' . 'lanToCoyoneda' ≡ 'id' -- 'lanToCoyoneda' . 'coyonedaToLan' ≡ 'id' @@ -73,21 +79,6 @@ -- {-# RULES "coyonedaToLan/lanToCoyoneda=id" coyonedaToLan . lanToCoyoneda = id #-} -- {-# RULES "lanToCoyoneda/coyonedaToLan=id" lanToCoyoneda . coyonedaToLan = id #-} --- | @'Coyoneda' f@ is the left Kan lift of @f@ along the 'Identity' functor. --- --- @ --- 'coyonedaToLift' . 'liftToCoyoneda' ≡ 'id' --- 'liftToCoyoneda' . 'coyonedaToLift' ≡ 'id' --- @ -coyonedaToLift :: Coyoneda f a -> Lift Identity f a -coyonedaToLift (Coyoneda ba fb) = Lift $ \ f2iz -> ba <$> runIdentity (f2iz fb) - -liftToCoyoneda :: Functor f => Lift Identity f a -> Coyoneda f a -liftToCoyoneda (Lift m) = Coyoneda id (m Identity) - --- {-# RULES "coyonedaToLift/liftToCoyoneda=id" coyonedaToLift . liftToCoyoneda = id #-} --- {-# RULES "liftToCoyoneda/coyonedaToLift=id" liftToCoyoneda . coyonedaToLift = id #-} - instance Functor (Coyoneda f) where fmap f (Coyoneda g v) = Coyoneda (f . g) v {-# INLINE fmap #-} @@ -121,8 +112,10 @@ {-# INLINE (>>-) #-} instance Monad m => Monad (Coyoneda m) where +#if __GLASGOW_HASKELL__ < 710 return = Coyoneda id . return {-# INLINE return #-} +#endif Coyoneda f v >>= k = lift (v >>= lowerM . k . f) {-# INLINE (>>=) #-} diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/kan-extensions-4.2.3/src/Data/Functor/Day/Curried.hs new/kan-extensions-5.0.1/src/Data/Functor/Day/Curried.hs --- old/kan-extensions-4.2.3/src/Data/Functor/Day/Curried.hs 1970-01-01 01:00:00.000000000 +0100 +++ new/kan-extensions-5.0.1/src/Data/Functor/Day/Curried.hs 2016-01-17 03:35:52.000000000 +0100 @@ -0,0 +1,137 @@ +{-# LANGUAGE CPP #-} +{-# LANGUAGE RankNTypes #-} +{-# LANGUAGE GADTs #-} + +#if __GLASGOW_HASKELL__ >= 702 && __GLASGOW_HASKELL__ < 710 +{-# LANGUAGE Trustworthy #-} +#endif +------------------------------------------------------------------------------------------- +-- | +-- Copyright : 2013-2016 Edward Kmett and Dan Doel +-- License : BSD +-- +-- Maintainer : Edward Kmett <ekm...@gmail.com> +-- Stability : experimental +-- Portability : rank N types +-- +-- @'Day' f -| 'Curried' f@ +-- +-- @'Day' f ~ 'Compose' f@ when f preserves colimits / is a left adjoint. (Due in part to the +-- strength of all functors in Hask.) +-- +-- So by the uniqueness of adjoints, when f is a left adjoint, @'Curried' f ~ 'Rift' f@ +------------------------------------------------------------------------------------------- +module Data.Functor.Day.Curried + ( + -- * Right Kan lifts + Curried(..) + , toCurried, fromCurried, applied, unapplied + , adjointToCurried, curriedToAdjoint + , composedAdjointToCurried, curriedToComposedAdjoint + , liftCurried, lowerCurried, rap + ) where + +#if __GLASGOW_HASKELL__ < 710 +import Control.Applicative +#endif +import Data.Functor.Adjunction +import Data.Functor.Day +import Data.Functor.Identity + +newtype Curried g h a = + Curried { runCurried :: forall r. g (a -> r) -> h r } + +instance Functor g => Functor (Curried g h) where + fmap f (Curried g) = Curried (g . fmap (.f)) + {-# INLINE fmap #-} + +instance (Functor g, g ~ h) => Applicative (Curried g h) where + pure a = Curried (fmap ($a)) + {-# INLINE pure #-} + Curried mf <*> Curried ma = Curried (ma . mf . fmap (.)) + {-# INLINE (<*>) #-} + +-- | The natural isomorphism between @f@ and @Curried f f@. +-- @ +-- 'lowerCurried' '.' 'liftCurried' ≡ 'id' +-- 'liftCurried' '.' 'lowerCurried' ≡ 'id' +-- @ +-- +-- @ +-- 'lowerCurried' ('liftCurried' x) -- definition +-- 'lowerCurried' ('Curried' ('<*>' x)) -- definition +-- ('<*>' x) ('pure' 'id') -- beta reduction +-- 'pure' 'id' '<*>' x -- Applicative identity law +-- x +-- @ +liftCurried :: Applicative f => f a -> Curried f f a +liftCurried fa = Curried (<*> fa) +{-# INLINE liftCurried #-} + +-- | Lower 'Curried' by applying 'pure' 'id' to the continuation. +-- +-- See 'liftCurried'. +lowerCurried :: Applicative f => Curried f g a -> g a +lowerCurried (Curried f) = f (pure id) +{-# INLINE lowerCurried #-} + +-- | Indexed applicative composition of right Kan lifts. +rap :: Functor f => Curried f g (a -> b) -> Curried g h a -> Curried f h b +rap (Curried mf) (Curried ma) = Curried (ma . mf . fmap (.)) +{-# INLINE rap #-} + +-- | This is the counit of the @Day f -| Curried f@ adjunction +applied :: Functor f => Day f (Curried f g) a -> g a +applied (Day fb (Curried fg) bca) = fg (bca <$> fb) +{-# INLINE applied #-} + +-- | This is the unit of the @Day f -| Curried f@ adjunction +unapplied :: g a -> Curried f (Day f g) a +unapplied ga = Curried $ \ fab -> Day fab ga id +{-# INLINE unapplied #-} + +-- | The universal property of 'Curried' +toCurried :: (forall x. Day g k x -> h x) -> k a -> Curried g h a +toCurried h ka = Curried $ \gar -> h (Day gar ka id) +{-# INLINE toCurried #-} + +-- | +-- @ +-- 'toCurried' . 'fromCurried' ≡ 'id' +-- 'fromCurried' . 'toCurried' ≡ 'id' +-- @ +fromCurried :: Functor f => (forall a. k a -> Curried f h a) -> Day f k b -> h b +fromCurried f (Day fc kd cdb) = runCurried (f kd) (cdb <$> fc) +{-# INLINE fromCurried #-} + +-- | @Curried f Identity a@ is isomorphic to the right adjoint to @f@ if one exists. +-- +-- @ +-- 'adjointToCurried' . 'curriedToAdjoint' ≡ 'id' +-- 'curriedToAdjoint' . 'adjointToCurried' ≡ 'id' +-- @ +adjointToCurried :: Adjunction f u => u a -> Curried f Identity a +adjointToCurried ua = Curried (Identity . rightAdjunct (<$> ua)) +{-# INLINE adjointToCurried #-} + +-- | @Curried f Identity a@ is isomorphic to the right adjoint to @f@ if one exists. +curriedToAdjoint :: Adjunction f u => Curried f Identity a -> u a +curriedToAdjoint (Curried m) = leftAdjunct (runIdentity . m) id +{-# INLINE curriedToAdjoint #-} + +-- | @Curried f h a@ is isomorphic to the post-composition of the right adjoint of @f@ onto @h@ if such a right adjoint exists. +-- +-- @ +-- 'curriedToComposedAdjoint' . 'composedAdjointToCurried' ≡ 'id' +-- 'composedAdjointToCurried' . 'curriedToComposedAdjoint' ≡ 'id' +-- @ + +curriedToComposedAdjoint :: Adjunction f u => Curried f h a -> u (h a) +curriedToComposedAdjoint (Curried m) = leftAdjunct m id +{-# INLINE curriedToComposedAdjoint #-} + +-- | @Curried f h a@ is isomorphic to the post-composition of the right adjoint of @f@ onto @h@ if such a right adjoint exists. +composedAdjointToCurried :: (Functor h, Adjunction f u) => u (h a) -> Curried f h a +composedAdjointToCurried uha = Curried $ rightAdjunct (\b -> fmap b <$> uha) +{-# INLINE composedAdjointToCurried #-} + diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/kan-extensions-4.2.3/src/Data/Functor/Day.hs new/kan-extensions-5.0.1/src/Data/Functor/Day.hs --- old/kan-extensions-4.2.3/src/Data/Functor/Day.hs 2015-09-14 01:13:30.000000000 +0200 +++ new/kan-extensions-5.0.1/src/Data/Functor/Day.hs 2016-01-17 03:35:52.000000000 +0100 @@ -6,7 +6,7 @@ {-# LANGUAGE RankNTypes #-} ----------------------------------------------------------------------------- -- | --- Copyright : (C) 2014 Edward Kmett +-- Copyright : (C) 2014-2016 Edward Kmett -- License : BSD-style (see the file LICENSE) -- -- Maintainer : Edward Kmett <ekm...@gmail.com> diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/kan-extensions-4.2.3/src/Data/Functor/Kan/Lan.hs new/kan-extensions-5.0.1/src/Data/Functor/Kan/Lan.hs --- old/kan-extensions-4.2.3/src/Data/Functor/Kan/Lan.hs 2015-09-14 01:13:30.000000000 +0200 +++ new/kan-extensions-5.0.1/src/Data/Functor/Kan/Lan.hs 2016-01-17 03:35:52.000000000 +0100 @@ -6,7 +6,7 @@ #endif ------------------------------------------------------------------------------------------- -- | --- Copyright : 2008-2013 Edward Kmett +-- Copyright : 2008-2016 Edward Kmett -- License : BSD -- -- Maintainer : Edward Kmett <ekm...@gmail.com> diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/kan-extensions-4.2.3/src/Data/Functor/Kan/Lift.hs new/kan-extensions-5.0.1/src/Data/Functor/Kan/Lift.hs --- old/kan-extensions-4.2.3/src/Data/Functor/Kan/Lift.hs 2015-09-14 01:13:30.000000000 +0200 +++ new/kan-extensions-5.0.1/src/Data/Functor/Kan/Lift.hs 1970-01-01 01:00:00.000000000 +0100 @@ -1,145 +0,0 @@ -{-# LANGUAGE CPP #-} -{-# LANGUAGE RankNTypes #-} -{-# LANGUAGE GADTs #-} - -#if defined(__GLASGOW_HASKELL__) && __GLASGOW_HASKELL__ >= 702 -{-# LANGUAGE Trustworthy #-} -#endif -------------------------------------------------------------------------------------------- --- | --- Copyright : 2013 Edward Kmett and Dan Doel --- License : BSD --- --- Maintainer : Edward Kmett <ekm...@gmail.com> --- Stability : experimental --- Portability : rank N types --- --- Left Kan lifts for functors over Hask, wherever they exist. --- --- <http://ncatlab.org/nlab/show/Kan+lift> -------------------------------------------------------------------------------------------- -module Data.Functor.Kan.Lift - ( - -- * Left Kan lifts - Lift(..) - , toLift, fromLift, glift - , composeLift, decomposeLift - , adjointToLift, liftToAdjoint - , liftToComposedAdjoint, composedAdjointToLift - , repToLift, liftToRep - , liftToComposedRep, composedRepToLift - ) where - -import Data.Functor.Adjunction -import Data.Functor.Composition -import Data.Functor.Compose -import Data.Functor.Identity -import Data.Functor.Rep - --- * Left Kan Lift - --- | --- > f => g . Lift g f --- > (forall z. f => g . z) -> Lift g f => z -- couniversal --- --- Here we use the universal property directly as how we extract from our definition of 'Lift'. -newtype Lift g f a = Lift { runLift :: forall z. Functor z => (forall x. f x -> g (z x)) -> z a } - -instance Functor (Lift g h) where - fmap f (Lift g) = Lift (\x -> fmap f (g x)) - {-# INLINE fmap #-} - --- | --- --- @f => g ('Lift' g f a)@ -glift :: Adjunction l g => k a -> g (Lift g k a) -glift = leftAdjunct (\lka -> Lift (\k2gz -> rightAdjunct k2gz lka)) -{-# INLINE glift #-} - --- | The universal property of 'Lift' -toLift :: Functor z => (forall a. f a -> g (z a)) -> Lift g f b -> z b -toLift f l = runLift l f -{-# INLINE toLift #-} - --- | When the adjunction exists --- --- @ --- 'fromLift' . 'toLift' ≡ 'id' --- 'toLift' . 'fromLift' ≡ 'id' --- @ -fromLift :: Adjunction l u => (forall a. Lift u f a -> z a) -> f b -> u (z b) -fromLift f = fmap f . glift -{-# INLINE fromLift #-} - --- | --- --- @ --- 'composeLift' . 'decomposeLift' = 'id' --- 'decomposeLift' . 'composeLift' = 'id' --- @ -composeLift :: (Composition compose, Functor f, Functor g) => Lift f (Lift g h) a -> Lift (compose g f) h a -composeLift (Lift m) = Lift $ \h -> m $ decompose . toLift (fmap Compose . decompose . h) -{-# INLINE composeLift #-} - -decomposeLift :: (Composition compose, Adjunction l g) => Lift (compose g f) h a -> Lift f (Lift g h) a -decomposeLift (Lift m) = Lift $ \h -> m (compose . fmap h . glift) -{-# INLINE decomposeLift #-} - --- | @Lift u Identity a@ is isomorphic to the left adjoint to @u@ if one exists. --- --- @ --- 'adjointToLift' . 'liftToAdjoint' ≡ 'id' --- 'liftToAdjoint' . 'adjointToLift' ≡ 'id' --- @ -adjointToLift :: Adjunction f u => f a -> Lift u Identity a -adjointToLift fa = Lift $ \k -> rightAdjunct (k . Identity) fa -{-# INLINE adjointToLift #-} - - --- | @Lift u Identity a@ is isomorphic to the left adjoint to @u@ if one exists. -liftToAdjoint :: Adjunction f u => Lift u Identity a -> f a -liftToAdjoint = toLift (unit . runIdentity) -{-# INLINE liftToAdjoint #-} - --- | --- --- @ --- 'repToLift' . 'liftToRep' ≡ 'id' --- 'liftToRep' . 'repToLift' ≡ 'id' --- @ -repToLift :: Representable u => Rep u -> a -> Lift u Identity a -repToLift e a = Lift $ \k -> index (k (Identity a)) e -{-# INLINE repToLift #-} - -liftToRep :: Representable u => Lift u Identity a -> (Rep u, a) -liftToRep (Lift m) = m $ \(Identity a) -> tabulate $ \e -> (e, a) -{-# INLINE liftToRep #-} - --- | @Lift u h a@ is isomorphic to the post-composition of the left adjoint of @u@ onto @h@ if such a left adjoint exists. --- --- @ --- 'liftToComposedAdjoint' . 'composedAdjointToLift' ≡ 'id' --- 'composedAdjointToLift' . 'liftToComposedAdjoint' ≡ 'id' --- @ -liftToComposedAdjoint :: (Adjunction f u, Functor h) => Lift u h a -> f (h a) -liftToComposedAdjoint (Lift m) = decompose $ m (leftAdjunct Compose) -{-# INLINE liftToComposedAdjoint #-} - --- | @Lift u h a@ is isomorphic to the post-composition of the left adjoint of @u@ onto @h@ if such a left adjoint exists. -composedAdjointToLift :: Adjunction f u => f (h a) -> Lift u h a -composedAdjointToLift = rightAdjunct glift -{-# INLINE composedAdjointToLift #-} - --- | --- --- @ --- 'liftToComposedRep' . 'composedRepToLift' ≡ 'id' --- 'composedRepToLift' . 'liftToComposedRep' ≡ 'id' --- @ -liftToComposedRep :: (Functor h, Representable u) => Lift u h a -> (Rep u, h a) -liftToComposedRep (Lift m) = decompose $ m $ \h -> tabulate $ \e -> Compose (e, h) -{-# INLINE liftToComposedRep #-} - -composedRepToLift :: Representable u => Rep u -> h a -> Lift u h a -composedRepToLift e ha = Lift $ \h2uz -> index (h2uz ha) e -{-# INLINE composedRepToLift #-} diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/kan-extensions-4.2.3/src/Data/Functor/Kan/Ran.hs new/kan-extensions-5.0.1/src/Data/Functor/Kan/Ran.hs --- old/kan-extensions-4.2.3/src/Data/Functor/Kan/Ran.hs 2015-09-14 01:13:30.000000000 +0200 +++ new/kan-extensions-5.0.1/src/Data/Functor/Kan/Ran.hs 2016-01-17 03:35:52.000000000 +0100 @@ -5,7 +5,7 @@ #endif ------------------------------------------------------------------------------------------- -- | --- Copyright : 2008-2013 Edward Kmett +-- Copyright : 2008-2016 Edward Kmett -- License : BSD -- -- Maintainer : Edward Kmett <ekm...@gmail.com> diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/kan-extensions-4.2.3/src/Data/Functor/Kan/Rift.hs new/kan-extensions-5.0.1/src/Data/Functor/Kan/Rift.hs --- old/kan-extensions-4.2.3/src/Data/Functor/Kan/Rift.hs 2015-09-14 01:13:30.000000000 +0200 +++ new/kan-extensions-5.0.1/src/Data/Functor/Kan/Rift.hs 1970-01-01 01:00:00.000000000 +0100 @@ -1,210 +0,0 @@ -{-# LANGUAGE CPP #-} -{-# LANGUAGE RankNTypes #-} -{-# LANGUAGE GADTs #-} - -#if __GLASGOW_HASKELL__ >= 702 && __GLASGOW_HASKELL__ < 710 -{-# LANGUAGE Trustworthy #-} -#endif -------------------------------------------------------------------------------------------- --- | --- Copyright : 2013 Edward Kmett and Dan Doel --- License : BSD --- --- Maintainer : Edward Kmett <ekm...@gmail.com> --- Stability : experimental --- Portability : rank N types --- --- Right and Left Kan lifts for functors over Hask, where they exist. --- --- <http://ncatlab.org/nlab/show/Kan+lift> -------------------------------------------------------------------------------------------- -module Data.Functor.Kan.Rift - ( - -- * Right Kan lifts - Rift(..) - , toRift, fromRift, grift - , composeRift, decomposeRift - , adjointToRift, riftToAdjoint - , composedAdjointToRift, riftToComposedAdjoint - , liftRift, lowerRift, rap - ) where - -#if __GLASGOW_HASKELL__ < 710 -import Control.Applicative -#endif -import Data.Functor.Adjunction -import Data.Functor.Composition -import Data.Functor.Identity - --- * Right Kan Lift - --- | --- --- @g . 'Rift' g f => f@ --- --- This could alternately be defined directly from the (co)universal propertly --- in which case, we'd get 'toRift' = 'UniversalRift', but then the usage would --- suffer. --- --- @ --- data 'UniversalRift' g f a = forall z. 'Functor' z => --- 'UniversalRift' (forall x. g (z x) -> f x) (z a) --- @ --- --- We can witness the isomorphism between Rift and UniversalRift using: --- --- @ --- riftIso1 :: Functor g => UniversalRift g f a -> Rift g f a --- riftIso1 (UniversalRift h z) = Rift $ \\g -> h $ fmap (\\k -> k \<$\> z) g --- @ --- --- @ --- riftIso2 :: Rift g f a -> UniversalRift g f a --- riftIso2 (Rift e) = UniversalRift e id --- @ --- --- @ --- riftIso1 (riftIso2 (Rift h)) = --- riftIso1 (UniversalRift h id) = -- by definition --- Rift $ \\g -> h $ fmap (\\k -> k \<$\> id) g -- by definition --- Rift $ \\g -> h $ fmap id g -- \<$\> = (.) and (.id) --- Rift $ \\g -> h g -- by functor law --- Rift h -- eta reduction --- @ --- --- The other direction is left as an exercise for the reader. --- --- There are several monads that we can form from @Rift@. --- --- When @g@ is corepresentable (e.g. is a right adjoint) then there exists @x@ such that @g ~ (->) x@, then it follows that --- --- @ --- Rift g g a ~ --- forall r. (x -> a -> r) -> x -> r ~ --- forall r. (a -> x -> r) -> x -> r ~ --- forall r. (a -> g r) -> g r ~ --- Codensity g r --- @ --- --- When @f@ is a left adjoint, so that @f -| g@ then --- --- @ --- Rift f f a ~ --- forall r. f (a -> r) -> f r ~ --- forall r. (a -> r) -> g (f r) ~ --- forall r. (a -> r) -> Adjoint f g r ~ --- Yoneda (Adjoint f g r) --- @ --- --- An alternative way to view that is to note that whenever @f@ is a left adjoint then @f -| 'Rift' f 'Identity'@, and since @'Rift' f f@ is isomorphic to @'Rift' f 'Identity' (f a)@, this is the 'Monad' formed by the adjunction. --- --- @'Rift' 'Identity' m@ can be a 'Monad' for any 'Monad' @m@, as it is isomorphic to @'Yoneda' m@. - -newtype Rift g h a = - Rift { runRift :: forall r. g (a -> r) -> h r } - -instance Functor g => Functor (Rift g h) where - fmap f (Rift g) = Rift (g . fmap (.f)) - {-# INLINE fmap #-} - -instance (Functor g, g ~ h) => Applicative (Rift g h) where - pure a = Rift (fmap ($a)) - {-# INLINE pure #-} - Rift mf <*> Rift ma = Rift (ma . mf . fmap (.)) - {-# INLINE (<*>) #-} - --- | The natural isomorphism between @f@ and @Rift f f@. --- @ --- 'lowerRift' '.' 'liftRift' ≡ 'id' --- 'liftRift' '.' 'lowerRift' ≡ 'id' --- @ --- --- @ --- 'lowerRift' ('liftRift' x) -- definition --- 'lowerRift' ('Rift' ('<*>' x)) -- definition --- ('<*>' x) ('pure' 'id') -- beta reduction --- 'pure' 'id' '<*>' x -- Applicative identity law --- x --- @ -liftRift :: Applicative f => f a -> Rift f f a -liftRift fa = Rift (<*> fa) -{-# INLINE liftRift #-} - --- | Lower 'Rift' by applying 'pure' 'id' to the continuation. --- --- See 'liftRift'. -lowerRift :: Applicative f => Rift f g a -> g a -lowerRift (Rift f) = f (pure id) -{-# INLINE lowerRift #-} - --- | Indexed applicative composition of right Kan lifts. -rap :: Functor f => Rift f g (a -> b) -> Rift g h a -> Rift f h b -rap (Rift mf) (Rift ma) = Rift (ma . mf . fmap (.)) -{-# INLINE rap #-} - -grift :: Adjunction f u => f (Rift f k a) -> k a -grift = rightAdjunct (\r -> leftAdjunct (runRift r) id) -{-# INLINE grift #-} - --- | The universal property of 'Rift' -toRift :: (Functor g, Functor k) => (forall x. g (k x) -> h x) -> k a -> Rift g h a -toRift h z = Rift $ \g -> h $ fmap (<$> z) g -{-# INLINE toRift #-} - --- | --- When @f -| u@, then @f -| Rift f Identity@ and --- --- @ --- 'toRift' . 'fromRift' ≡ 'id' --- 'fromRift' . 'toRift' ≡ 'id' --- @ -fromRift :: Adjunction f u => (forall a. k a -> Rift f h a) -> f (k b) -> h b -fromRift f = grift . fmap f -{-# INLINE fromRift #-} - --- | @Rift f Identity a@ is isomorphic to the right adjoint to @f@ if one exists. --- --- @ --- 'adjointToRift' . 'riftToAdjoint' ≡ 'id' --- 'riftToAdjoint' . 'adjointToRift' ≡ 'id' --- @ -adjointToRift :: Adjunction f u => u a -> Rift f Identity a -adjointToRift ua = Rift (Identity . rightAdjunct (<$> ua)) -{-# INLINE adjointToRift #-} - --- | @Rift f Identity a@ is isomorphic to the right adjoint to @f@ if one exists. -riftToAdjoint :: Adjunction f u => Rift f Identity a -> u a -riftToAdjoint (Rift m) = leftAdjunct (runIdentity . m) id -{-# INLINE riftToAdjoint #-} - --- | --- --- @ --- 'composeRift' . 'decomposeRift' ≡ 'id' --- 'decomposeRift' . 'composeRift' ≡ 'id' --- @ -composeRift :: (Composition compose, Adjunction g u) => Rift f (Rift g h) a -> Rift (compose g f) h a -composeRift (Rift f) = Rift (grift . fmap f . decompose) -{-# INLINE composeRift #-} - -decomposeRift :: (Composition compose, Functor f, Functor g) => Rift (compose g f) h a -> Rift f (Rift g h) a -decomposeRift (Rift f) = Rift $ \far -> Rift (f . compose . fmap (\rs -> fmap (rs.) far)) -{-# INLINE decomposeRift #-} - - --- | @Rift f h a@ is isomorphic to the post-composition of the right adjoint of @f@ onto @h@ if such a right adjoint exists. --- --- @ --- 'riftToComposedAdjoint' . 'composedAdjointToRift' ≡ 'id' --- 'composedAdjointToRift' . 'riftToComposedAdjoint' ≡ 'id' --- @ - -riftToComposedAdjoint :: Adjunction f u => Rift f h a -> u (h a) -riftToComposedAdjoint (Rift m) = leftAdjunct m id -{-# INLINE riftToComposedAdjoint #-} - --- | @Rift f h a@ is isomorphic to the post-composition of the right adjoint of @f@ onto @h@ if such a right adjoint exists. -composedAdjointToRift :: (Functor h, Adjunction f u) => u (h a) -> Rift f h a -composedAdjointToRift uha = Rift $ rightAdjunct (\b -> fmap b <$> uha) -{-# INLINE composedAdjointToRift #-} - diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/kan-extensions-4.2.3/src/Data/Functor/Yoneda.hs new/kan-extensions-5.0.1/src/Data/Functor/Yoneda.hs --- old/kan-extensions-4.2.3/src/Data/Functor/Yoneda.hs 2015-09-14 01:13:30.000000000 +0200 +++ new/kan-extensions-5.0.1/src/Data/Functor/Yoneda.hs 2016-01-17 03:35:52.000000000 +0100 @@ -12,7 +12,7 @@ ----------------------------------------------------------------------------- -- | -- Module : Data.Functor.Yoneda --- Copyright : (C) 2011-2013 Edward Kmett +-- Copyright : (C) 2011-2016 Edward Kmett -- License : BSD-style (see the file LICENSE) -- -- Maintainer : Edward Kmett <ekm...@gmail.com> @@ -33,8 +33,6 @@ , maxF, minF, maxM, minM -- * as a right Kan extension , yonedaToRan, ranToYoneda - -- * as a right Kan lift - , yonedaToRift, riftToYoneda ) where import Control.Applicative @@ -52,7 +50,6 @@ import Data.Functor.Extend import Data.Functor.Identity import Data.Functor.Kan.Ran -import Data.Functor.Kan.Rift import Data.Functor.Plus import Data.Functor.Rep import Data.Semigroup.Foldable @@ -90,7 +87,7 @@ lowerYoneda (Yoneda f) = f id -- {-# RULES "lower/lift=id" liftYoneda . lowerYoneda = id #-} ---{-# RULES "lift/lower=id" lowerYoneda . liftYoneda = id #-} +-- {-# RULES "lift/lower=id" lowerYoneda . liftYoneda = id #-} -- | @Yoneda f@ can be viewed as the right Kan extension of @f@ along the 'Identity' functor. -- @@ -107,23 +104,6 @@ -- {-# RULES "yonedaToRan/ranToYoneda=id" yonedaToRan . ranToYoneda = id #-} -- {-# RULES "ranToYoneda/yonedaToRan=id" ranToYoneda . yonedaToRan = id #-} --- | @Yoneda f@ can be viewed as 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)) @@ -211,7 +191,9 @@ Yoneda m >>- k = Yoneda (\f -> m id >>- \a -> runYoneda (k a) f) instance Monad m => Monad (Yoneda m) where +#if __GLASGOW_HASKELL__ < 710 return a = Yoneda (\f -> return (f a)) +#endif Yoneda m >>= k = Yoneda (\f -> m id >>= \a -> runYoneda (k a) f) instance MonadFix m => MonadFix (Yoneda m) where