contravariant 1.0 → 1.1
raw patch · 2 files changed
+62/−1 lines, 2 filesdep +semigroupsPVP ok
version bump matches the API change (PVP)
Dependencies added: semigroups
API changes (from Hackage documentation)
+ Data.Functor.Contravariant: comparisonEquivalence :: Comparison a -> Equivalence a
+ Data.Functor.Contravariant: instance [safe] Floating a => Floating (Op a b)
+ Data.Functor.Contravariant: instance [safe] Fractional a => Fractional (Op a b)
+ Data.Functor.Contravariant: instance [safe] Monoid (Comparison a)
+ Data.Functor.Contravariant: instance [safe] Monoid (Equivalence a)
+ Data.Functor.Contravariant: instance [safe] Monoid a => Monoid (Op a b)
+ Data.Functor.Contravariant: instance [safe] Num a => Num (Op a b)
+ Data.Functor.Contravariant: instance [safe] Semigroup (Comparison a)
+ Data.Functor.Contravariant: instance [safe] Semigroup (Equivalence a)
+ Data.Functor.Contravariant: instance [safe] Semigroup a => Semigroup (Op a b)
Files
- Data/Functor/Contravariant.hs +60/−0
- contravariant.cabal +2/−1
Data/Functor/Contravariant.hs view
@@ -48,6 +48,7 @@ -- * Equivalence Relations , Equivalence(..) , defaultEquivalence+ , comparisonEquivalence -- * Dual arrows , Op(..)@@ -64,6 +65,8 @@ import Data.Functor.Compose import Data.Functor.Reverse +import Data.Semigroup (Semigroup(..), Monoid(..))+ #ifdef LANGUAGE_DeriveDataTypeable import Data.Typeable #endif@@ -187,6 +190,13 @@ instance Contravariant Comparison where contramap f g = Comparison $ \a b -> getComparison g (f a) (f b) +instance Semigroup (Comparison a) where+ Comparison p <> Comparison q = Comparison $ mappend p q++instance Monoid (Comparison a) where+ mempty = Comparison (\_ _ -> EQ)+ mappend (Comparison p) (Comparison q) = Comparison $ mappend p q+ -- | Compare using 'compare' defaultComparison :: Ord a => Comparison a defaultComparison = Comparison compare@@ -203,10 +213,20 @@ instance Contravariant Equivalence where contramap f g = Equivalence $ \a b -> getEquivalence g (f a) (f b) +instance Semigroup (Equivalence a) where+ Equivalence p <> Equivalence q = Equivalence $ \a b -> p a b && q a b++instance Monoid (Equivalence a) where+ mempty = Equivalence (\_ _ -> True)+ mappend (Equivalence p) (Equivalence q) = Equivalence $ \a b -> p a b && q a b+ -- | Check for equivalence with '==' defaultEquivalence :: Eq a => Equivalence a defaultEquivalence = Equivalence (==) +comparisonEquivalence :: Comparison a -> Equivalence a+comparisonEquivalence (Comparison p) = Equivalence $ \a b -> p a b == EQ+ -- | Dual function arrows. newtype Op a b = Op { getOp :: b -> a } #ifdef LANGUAGE_DeriveDataTypeable@@ -219,3 +239,43 @@ instance Contravariant (Op a) where contramap f g = Op (getOp g . f)++instance Semigroup a => Semigroup (Op a b) where+ Op p <> Op q = Op $ \a -> p a <> q a++instance Monoid a => Monoid (Op a b) where+ mempty = Op (const mempty)+ mappend (Op p) (Op q) = Op $ \a -> mappend (p a) (q a)++instance Num a => Num (Op a b) where+ Op f + Op g = Op $ \a -> f a + g a+ Op f * Op g = Op $ \a -> f a * g a+ Op f - Op g = Op $ \a -> f a - g a+ abs (Op f) = Op $ abs . f+ signum (Op f) = Op $ signum . f+ fromInteger = Op . const . fromInteger++instance Fractional a => Fractional (Op a b) where+ Op f / Op g = Op $ \a -> f a / g a+ recip (Op f) = Op $ recip . f+ fromRational = Op . const . fromRational++instance Floating a => Floating (Op a b) where+ pi = Op $ const pi+ exp (Op f) = Op $ exp . f+ sqrt (Op f) = Op $ sqrt . f+ log (Op f) = Op $ log . f+ sin (Op f) = Op $ sin . f+ tan (Op f) = Op $ tan . f+ cos (Op f) = Op $ cos . f+ asin (Op f) = Op $ asin . f+ atan (Op f) = Op $ atan . f+ acos (Op f) = Op $ acos . f+ sinh (Op f) = Op $ sinh . f+ tanh (Op f) = Op $ tanh . f+ cosh (Op f) = Op $ cosh . f+ asinh (Op f) = Op $ asinh . f+ atanh (Op f) = Op $ atanh . f+ acosh (Op f) = Op $ acosh . f+ Op f ** Op g = Op $ \a -> f a ** g a+ logBase (Op f) (Op g) = Op $ \a -> logBase (f a) (g a)
contravariant.cabal view
@@ -1,6 +1,6 @@ name: contravariant category: Control, Data-version: 1.0+version: 1.1 license: BSD3 cabal-version: >= 1.6 license-file: LICENSE@@ -32,6 +32,7 @@ library build-depends: base < 5,+ semigroups >= 0.15.2 && < 1, transformers >= 0.2 && < 0.5, transformers-compat >= 0.3 && < 1