monoid-extras 0.5 → 0.5.1
raw patch · 4 files changed
+184/−7 lines, 4 filesdep ~basedep ~groupsPVP: major bump suggested
API removals or changes: PVP suggests a major version bump
Dependency ranges changed: base, groups
API changes (from Hackage documentation)
- Data.Monoid.Action: instance Data.Monoid.Action.Action (Data.Monoid.Endo a) a
- Data.Monoid.Coproduct: instance Data.Semigroup.Semigroup (m Data.Monoid.Coproduct.:+: n)
- Data.Monoid.Cut: instance (Data.Semigroup.Semigroup m, GHC.Base.Monoid m) => GHC.Base.Monoid (Data.Monoid.Cut.Cut m)
- Data.Monoid.Cut: instance Data.Semigroup.Semigroup m => Data.Semigroup.Semigroup (Data.Monoid.Cut.Cut m)
- Data.Monoid.Deletable: instance (Data.Semigroup.Semigroup m, GHC.Base.Monoid m) => GHC.Base.Monoid (Data.Monoid.Deletable.Deletable m)
- Data.Monoid.Deletable: instance Data.Semigroup.Semigroup m => Data.Semigroup.Semigroup (Data.Monoid.Deletable.Deletable m)
- Data.Monoid.Endomorphism: instance Data.Semigroupoid.Semigroupoid k => Data.Semigroup.Semigroup (Data.Monoid.Endomorphism.Endomorphism k a)
- Data.Monoid.Inf: instance (Data.Data.Data a, Data.Data.Data p) => Data.Data.Data (Data.Monoid.Inf.Inf p a)
- Data.Monoid.Inf: instance GHC.Classes.Ord a => Data.Semigroup.Semigroup (Data.Monoid.Inf.Inf Data.Monoid.Inf.Neg a)
- Data.Monoid.Inf: instance GHC.Classes.Ord a => Data.Semigroup.Semigroup (Data.Monoid.Inf.Inf Data.Monoid.Inf.Pos a)
- Data.Monoid.Recommend: instance (Data.Semigroup.Semigroup a, GHC.Base.Monoid a) => GHC.Base.Monoid (Data.Monoid.Recommend.Recommend a)
- Data.Monoid.Recommend: instance Data.Semigroup.Semigroup a => Data.Semigroup.Semigroup (Data.Monoid.Recommend.Recommend a)
- Data.Monoid.SemiDirectProduct: instance (Data.Semigroup.Semigroup m, Data.Semigroup.Semigroup s, Data.Monoid.Action.Action m s) => Data.Semigroup.Semigroup (Data.Monoid.SemiDirectProduct.Semi s m)
- Data.Monoid.SemiDirectProduct.Strict: instance (Data.Semigroup.Semigroup m, Data.Semigroup.Semigroup s, Data.Monoid.Action.Action m s) => Data.Semigroup.Semigroup (Data.Monoid.SemiDirectProduct.Strict.Semi s m)
- Data.Monoid.Split: instance (Data.Semigroup.Semigroup m, GHC.Base.Monoid m) => GHC.Base.Monoid (Data.Monoid.Split.Split m)
- Data.Monoid.Split: instance Data.Semigroup.Semigroup m => Data.Semigroup.Semigroup (Data.Monoid.Split.Split m)
+ Data.Monoid.Action: instance Data.Monoid.Action.Action (Data.Semigroup.Internal.Endo a) a
+ Data.Monoid.Coproduct: instance GHC.Base.Semigroup (m Data.Monoid.Coproduct.:+: n)
+ Data.Monoid.Coproduct.Strict: _L :: (Action m n, Monoid m, Semigroup n) => Lens (m :+: n) (m' :+: n) m m'
+ Data.Monoid.Coproduct.Strict: _R :: (Action m n, Monoid' n) => Lens (m :+: n) (m :+: n') n n'
+ Data.Monoid.Coproduct.Strict: data m :+: n
+ Data.Monoid.Coproduct.Strict: inL :: m -> m :+: n
+ Data.Monoid.Coproduct.Strict: inR :: n -> m :+: n
+ Data.Monoid.Coproduct.Strict: instance (Data.Monoid.Action.Action m n, Data.Monoid.Action.Action m r, Data.Monoid.Action.Action n r, GHC.Base.Semigroup n) => Data.Monoid.Action.Action (m Data.Monoid.Coproduct.Strict.:+: n) r
+ Data.Monoid.Coproduct.Strict: instance (Data.Monoid.Action.Action m n, GHC.Base.Monoid m, Data.Monoid.WithSemigroup.Monoid' n, GHC.Show.Show m, GHC.Show.Show n) => GHC.Show.Show (m Data.Monoid.Coproduct.Strict.:+: n)
+ Data.Monoid.Coproduct.Strict: instance (Data.Monoid.Action.Action m n, GHC.Base.Semigroup m, GHC.Base.Semigroup n) => GHC.Base.Monoid (m Data.Monoid.Coproduct.Strict.:+: n)
+ Data.Monoid.Coproduct.Strict: instance (Data.Monoid.Action.Action m n, GHC.Base.Semigroup m, GHC.Base.Semigroup n) => GHC.Base.Semigroup (m Data.Monoid.Coproduct.Strict.:+: n)
+ Data.Monoid.Coproduct.Strict: instance GHC.Base.Semigroup a => GHC.Base.Monoid (Data.Monoid.Coproduct.Strict.Possible a)
+ Data.Monoid.Coproduct.Strict: instance GHC.Base.Semigroup a => GHC.Base.Semigroup (Data.Monoid.Coproduct.Strict.Possible a)
+ Data.Monoid.Coproduct.Strict: killL :: (Action m n, Monoid' n) => (m :+: n) -> n
+ Data.Monoid.Coproduct.Strict: killR :: Monoid m => (m :+: n) -> m
+ Data.Monoid.Coproduct.Strict: prependL :: Semigroup m => m -> (m :+: n) -> m :+: n
+ Data.Monoid.Coproduct.Strict: prependR :: Semigroup n => n -> (m :+: n) -> m :+: n
+ Data.Monoid.Coproduct.Strict: untangle :: (Action m n, Monoid m, Monoid' n) => (m :+: n) -> (m, n)
+ Data.Monoid.Coproduct.Strict: untangled :: (Action m n, Monoid m, Monoid' n) => Lens (m :+: n) (m' :+: n') (m, n) (m', n')
+ Data.Monoid.Cut: infix 5 :||:
+ Data.Monoid.Cut: instance (GHC.Base.Semigroup m, GHC.Base.Monoid m) => GHC.Base.Monoid (Data.Monoid.Cut.Cut m)
+ Data.Monoid.Cut: instance GHC.Base.Semigroup m => GHC.Base.Semigroup (Data.Monoid.Cut.Cut m)
+ Data.Monoid.Deletable: instance (GHC.Base.Semigroup m, GHC.Base.Monoid m) => GHC.Base.Monoid (Data.Monoid.Deletable.Deletable m)
+ Data.Monoid.Deletable: instance GHC.Base.Semigroup m => GHC.Base.Semigroup (Data.Monoid.Deletable.Deletable m)
+ Data.Monoid.Endomorphism: instance Data.Semigroupoid.Semigroupoid k => GHC.Base.Semigroup (Data.Monoid.Endomorphism.Endomorphism k a)
+ Data.Monoid.Inf: instance (Data.Data.Data p, Data.Data.Data a) => Data.Data.Data (Data.Monoid.Inf.Inf p a)
+ Data.Monoid.Inf: instance GHC.Classes.Ord a => GHC.Base.Semigroup (Data.Monoid.Inf.Inf Data.Monoid.Inf.Neg a)
+ Data.Monoid.Inf: instance GHC.Classes.Ord a => GHC.Base.Semigroup (Data.Monoid.Inf.Inf Data.Monoid.Inf.Pos a)
+ Data.Monoid.Recommend: instance (GHC.Base.Semigroup a, GHC.Base.Monoid a) => GHC.Base.Monoid (Data.Monoid.Recommend.Recommend a)
+ Data.Monoid.Recommend: instance GHC.Base.Semigroup a => GHC.Base.Semigroup (Data.Monoid.Recommend.Recommend a)
+ Data.Monoid.SemiDirectProduct: instance (GHC.Base.Semigroup m, GHC.Base.Semigroup s, Data.Monoid.Action.Action m s) => GHC.Base.Semigroup (Data.Monoid.SemiDirectProduct.Semi s m)
+ Data.Monoid.SemiDirectProduct.Strict: instance (GHC.Base.Semigroup m, GHC.Base.Semigroup s, Data.Monoid.Action.Action m s) => GHC.Base.Semigroup (Data.Monoid.SemiDirectProduct.Strict.Semi s m)
+ Data.Monoid.Split: infix 5 :|
+ Data.Monoid.Split: instance (GHC.Base.Semigroup m, GHC.Base.Monoid m) => GHC.Base.Monoid (Data.Monoid.Split.Split m)
+ Data.Monoid.Split: instance GHC.Base.Semigroup m => GHC.Base.Semigroup (Data.Monoid.Split.Split m)
- Data.Monoid.Coproduct: data m (:+:) n
+ Data.Monoid.Coproduct: data m :+: n
- Data.Monoid.Coproduct: killL :: Monoid n => m :+: n -> n
+ Data.Monoid.Coproduct: killL :: Monoid n => (m :+: n) -> n
- Data.Monoid.Coproduct: killR :: Monoid m => m :+: n -> m
+ Data.Monoid.Coproduct: killR :: Monoid m => (m :+: n) -> m
- Data.Monoid.Coproduct: mappendL :: m -> m :+: n -> m :+: n
+ Data.Monoid.Coproduct: mappendL :: m -> (m :+: n) -> m :+: n
- Data.Monoid.Coproduct: mappendR :: n -> m :+: n -> m :+: n
+ Data.Monoid.Coproduct: mappendR :: n -> (m :+: n) -> m :+: n
- Data.Monoid.Coproduct: untangle :: (Action m n, Monoid m, Monoid n) => m :+: n -> (m, n)
+ Data.Monoid.Coproduct: untangle :: (Action m n, Monoid m, Monoid n) => (m :+: n) -> (m, n)
- Data.Monoid.WithSemigroup: type Monoid' m = (Semigroup m, Monoid m)
+ Data.Monoid.WithSemigroup: type Monoid' = Monoid
Files
- CHANGES +7/−0
- monoid-extras.cabal +9/−6
- src/Data/Monoid/Coproduct/Strict.hs +167/−0
- src/Data/Monoid/Recommend.hs +1/−1
CHANGES view
@@ -1,3 +1,10 @@+* 0.5.1: 19 Oct 2019++- New module Data.Monoid.Coproduct.Strict for a more efficient coproduct in+ some use cases.+- Update for GHC 8.8.+- Drop support for GHC 7.8.+ * 0.5: 14 May 2018 - Modernize Data.Monoid.WithSemigroup
monoid-extras.cabal view
@@ -1,5 +1,5 @@ name: monoid-extras-version: 0.5+version: 0.5.1 synopsis: Various extra monoid-related definitions and utilities description: Various extra monoid-related definitions and utilities, such as monoid actions, monoid coproducts, semi-direct@@ -14,7 +14,7 @@ category: Data build-type: Simple cabal-version: >=1.10-tested-with: GHC == 7.8.4, GHC == 7.10.3, GHC == 8.0.2, GHC == 8.2.2, GHC == 8.4.2+tested-with: GHC == 7.10.3, GHC == 8.0.2, GHC == 8.2.2, GHC == 8.4.2, GHC == 8.6.1, GHC == 8.8.1 source-repository head type: git@@ -26,6 +26,7 @@ Data.Monoid.SemiDirectProduct, Data.Monoid.SemiDirectProduct.Strict Data.Monoid.Coproduct,+ Data.Monoid.Coproduct.Strict, Data.Monoid.Cut, Data.Monoid.Deletable, Data.Monoid.Endomorphism,@@ -35,13 +36,15 @@ Data.Monoid.Split, Data.Monoid.WithSemigroup - build-depends: base >= 4.3 && < 4.12,+ build-depends: base >= 4.3 && < 4.14, groups < 0.5,- semigroups >= 0.8 && < 0.19,- semigroupoids >= 4.0 && < 5.3+ semigroups >= 0.8 && < 0.20,+ semigroupoids >= 4.0 && < 5.4 hs-source-dirs: src + ghc-options: -Wall+ other-extensions: DeriveFunctor, FlexibleInstances, MultiParamTypeClasses,@@ -52,7 +55,7 @@ hs-source-dirs: benchmarks main-is: SemiDirectProduct.hs type: exitcode-stdio-1.0- build-depends: base >= 4.3 && < 4.12+ build-depends: base >= 4.3 && < 4.14 , semigroups , criterion , monoid-extras
+ src/Data/Monoid/Coproduct/Strict.hs view
@@ -0,0 +1,167 @@+{-# LANGUAGE BangPatterns #-}+{-# LANGUAGE FlexibleInstances #-}+{-# LANGUAGE MonoLocalBinds #-}+{-# LANGUAGE MultiParamTypeClasses #-}+{-# LANGUAGE RankNTypes #-}+{-# LANGUAGE TypeOperators #-}++-----------------------------------------------------------------------------+-- |+-- Module : Data.Monoid.Coproduct.Strict+-- Copyright : (c) 2015 diagrams-core team (see LICENSE)+-- License : BSD-style (see LICENSE)+-- Maintainer : diagrams-discuss@googlegroups.com+--+-- A strict coproduct of two monoids.+--+-----------------------------------------------------------------------------++module Data.Monoid.Coproduct.Strict+ (+ -- * Coproduct+ (:+:)+ , inL, inR+ , prependL, prependR+ , killL, killR+ , untangle++ -- ** Lenses+ , untangled+ , _L+ , _R++ ) where++import Data.Monoid.Action+import Data.Monoid.WithSemigroup+import Data.Semigroup+import Prelude++-- Internal strict version of 'Data.Semigroup.Option'+data Possible a = Only !a | Nought++instance Semigroup a => Semigroup (Possible a) where+ Only a <> Only b = Only (a <> b)+ Nought <> b = b+ a <> _ = a+ {-# INLINE (<>) #-}++instance Semigroup a => Monoid (Possible a) where+ mempty = Nought+ {-# INLINE mempty #-}+ mappend = (<>)+ {-# INLINE mappend #-}++-- | @m :+: n@ is the coproduct of monoids @m@ and @n@. Concatentation+-- is equivilent to+--+-- @+-- (m1 :+: n1) <> (m2 :+: n2) = (m1 <> m2) :+: (n1 <> act m1 n2)@+-- @+--+-- but has a more efficient internal implimentation.+data m :+: n = C !(Possible n) !(Possible m) !(Possible n)+-- The left n already has the action m applied. The right n still needs+-- m applied, but it kept there incase more n comes to reduce the number+-- of actions that need to be applied.++instance (Action m n, Monoid m, Monoid' n, Show m, Show n) => Show (m :+: n) where+ showsPrec p c = showParen (p > 5) $+ showsPrec 11 m . showString " :+: " . showsPrec 11 n+ where (m,n) = untangle c++instance (Action m n, Semigroup m, Semigroup n) => Semigroup (m :+: n) where+ C n1 m1 o1 <> C n2 m2 o2 = C (n1 <> act' m1 (o1 <> n2)) (m1 <> m2) o2+ {-# INLINE (<>) #-}++instance (Action m n, Semigroup m, Semigroup n) => Monoid (m :+: n) where+ mempty = C Nought Nought Nought+ {-# INLINE mempty #-}+ mappend = (<>)+ {-# INLINE mappend #-}++-- | Coproducts act on other things by having each of the components+-- act individually.+instance (Action m n, Action m r, Action n r, Semigroup n) => Action (m :+: n) r where+ act (C n m o) = act'' n' . act'' m+ where !n' = n <> act' m o+ {-# INLINE act #-}++-- | Construct a coproduct with a left value.+inL :: m -> m :+: n+inL m = C Nought (Only m) Nought+{-# INLINE inL #-}++-- | Construct a coproduct with a right value.+inR :: n -> m :+: n+inR r = C (Only r) Nought Nought+{-# INLINE inR #-}++-- | Prepend a value from the left.+prependL :: Semigroup m => m -> m :+: n -> m :+: n+prependL m' (C n m o) = C n (Only m' <> m) o+{-# INLINE prependL #-}++-- | Prepend a value from the right.+prependR :: Semigroup n => n -> m :+: n -> m :+: n+prependR n' (C n m o) = C (Only n' <> n) m o+{-# INLINE prependR #-}++-- | Extract @m@ from a coproduct.+killR :: Monoid m => m :+: n -> m+killR (C _ m _) = get m+{-# INLINE killR #-}++-- | Extract @n@ from a coproduct.+killL :: (Action m n, Monoid' n) => m :+: n -> n+killL (C n m o) = get $ n <> act' m o+{-# INLINE killL #-}++untangle :: (Action m n, Monoid m, Monoid' n) => m :+: n -> (m,n)+untangle (C n m o) = (get m, get n')+ where !n' = n <> act' m o+{-# INLINE untangle #-}++-- Lenses --------------------------------------------------------------++type Lens s t a b = forall f. Functor f => (a -> f b) -> s -> f t++-- | Lens onto the both @m@ and @n@.+untangled :: (Action m n, Monoid m, Monoid' n) => Lens (m :+: n) (m' :+: n') (m,n) (m',n')+untangled f c = f (untangle c) <&> \(m',n') -> C (Only n') (Only m') Nought+{-# INLINE untangled #-}+-- this could be an iso if we depended on profunctors++-- | Lens onto the left value of a coproduct.+_L :: (Action m n, Monoid m, Semigroup n) => Lens (m :+: n) (m' :+: n) m m'+_L f (C n m o) = f (get m) <&> \m' -> C (n <> act' m o) (Only m') Nought+{-# INLINE _L #-}+-- this could be a prism if we depended on profunctors++-- | Lens onto the right value of a coproduct.+_R :: (Action m n, Monoid' n) => Lens (m :+: n) (m :+: n') n n'+_R f (C n m o) = f (get $ n `mappend` act' m o) <&> \n' -> C (Only n') m Nought+{-# INLINE _R #-}++-- Internal utilities --------------------------------------------------++get :: Monoid a => Possible a -> a+get (Only a) = a+get _ = mempty+{-# INLINE get #-}++(<&>) :: Functor f => f a -> (a -> b) -> f b+(<&>) = flip fmap+{-# INLINE (<&>) #-}++-- Act on a possible with a possible+act' :: Action m n => Possible m -> Possible n -> Possible n+act' (Only m) (Only n) = Only (act m n)+act' _ n = n+{-# INLINE act' #-}++-- Act with a possible+act'' :: Action m n => Possible m -> n -> n+act'' (Only m) = act m+act'' _ = id+{-# INLINE act'' #-}
src/Data/Monoid/Recommend.hs view
@@ -14,7 +14,7 @@ -- -- A type for representing values with an additional bit saying -- whether the value is \"just a recommendation\" (to be used only if--- nothing better comes along) or a \"committment\" (to certainly be+-- nothing better comes along) or a \"commitment\" (to certainly be -- used, overriding merely recommended values), along with -- corresponding @Semigroup@ and @Monoid@ instances. --