monoid-extras 0.4.0.4 → 0.4.1
raw patch · 5 files changed
+153/−1 lines, 5 filesdep +criteriondep +monoid-extrasPVP ok
version bump matches the API change (PVP)
Dependencies added: criterion, monoid-extras
API changes (from Hackage documentation)
+ Data.Monoid.MList: infixr 5 *:
+ Data.Monoid.SemiDirectProduct: data Semi s m
+ Data.Monoid.SemiDirectProduct: embed :: Monoid s => m -> Semi s m
+ Data.Monoid.SemiDirectProduct: inject :: Monoid m => s -> Semi s m
+ Data.Monoid.SemiDirectProduct: instance (GHC.Base.Monoid m, GHC.Base.Monoid s, Data.Monoid.Action.Action m s) => GHC.Base.Monoid (Data.Monoid.SemiDirectProduct.Semi s m)
+ Data.Monoid.SemiDirectProduct: quotient :: Semi s m -> m
+ Data.Monoid.SemiDirectProduct.Strict: data Semi s m
+ Data.Monoid.SemiDirectProduct.Strict: embed :: Monoid s => m -> Semi s m
+ Data.Monoid.SemiDirectProduct.Strict: inject :: Monoid m => s -> Semi s m
+ Data.Monoid.SemiDirectProduct.Strict: instance (GHC.Base.Monoid m, GHC.Base.Monoid s, Data.Monoid.Action.Action m s) => GHC.Base.Monoid (Data.Monoid.SemiDirectProduct.Strict.Semi s m)
+ Data.Monoid.SemiDirectProduct.Strict: quotient :: Semi s m -> m
Files
- CHANGES +4/−0
- benchmarks/SemiDirectProduct.hs +37/−0
- monoid-extras.cabal +12/−1
- src/Data/Monoid/SemiDirectProduct.hs +50/−0
- src/Data/Monoid/SemiDirectProduct/Strict.hs +50/−0
CHANGES view
@@ -1,3 +1,7 @@+* 0.4.1: 8 June 2016++- new modules Data.Monoid.SemiDirectProduct[.Strict].+ * 0.4.0.4: 14 February 2016 - allow base-4.9 for GHC-8
+ benchmarks/SemiDirectProduct.hs view
@@ -0,0 +1,37 @@+{-# LANGUAGE CPP #-}+{-# LANGUAGE FlexibleInstances #-}+{-# LANGUAGE MultiParamTypeClasses #-}+{-# LANGUAGE GeneralizedNewtypeDeriving #-}++module Main where++import Criterion.Main++#if !MIN_VERSION_base(4,8,0)+import Data.Monoid+import Data.Word+#else+import Data.Monoid (Sum(..))+#endif++import Data.Monoid.Action+import qualified Data.Monoid.SemiDirectProduct as L+import qualified Data.Monoid.SemiDirectProduct.Strict as S++newtype MyMonoid = MyMonoid (Sum Word) deriving Monoid++instance Action MyMonoid () where+ act _ = id+ {-# NOINLINE act #-}++main :: IO ()+main = defaultMain+ [ bench "mconcat/strict" $ whnf mconcat strict+ , bench "mconcat/lazy" $ whnf mconcat lazy+ , bench "strict/quotient" $ whnf (S.quotient . mconcat) strict+ , bench "lazy/quotient" $ whnf (L.quotient . mconcat) lazy+ ]+ where strict :: [S.Semi () MyMonoid]+ strict = map (S.embed . MyMonoid . Sum) $ take 1000 [1..]+ lazy :: [L.Semi () (MyMonoid)]+ lazy = map (L.embed . MyMonoid . Sum) $ take 1000 [1..]
monoid-extras.cabal view
@@ -1,5 +1,5 @@ name: monoid-extras-version: 0.4.0.4+version: 0.4.1 synopsis: Various extra monoid-related definitions and utilities description: Various extra monoid-related definitions and utilities, such as monoid actions, monoid coproducts, \"deletable\"@@ -22,6 +22,8 @@ library default-language: Haskell2010 exposed-modules: Data.Monoid.Action,+ Data.Monoid.SemiDirectProduct,+ Data.Monoid.SemiDirectProduct.Strict Data.Monoid.Coproduct, Data.Monoid.Cut, Data.Monoid.Deletable,@@ -43,3 +45,12 @@ FlexibleInstances, MultiParamTypeClasses, TypeOperators++benchmark semi-direct-product+ default-language: Haskell2010+ hs-source-dirs: benchmarks+ main-is: SemiDirectProduct.hs+ type: exitcode-stdio-1.0+ build-depends: base >= 4.3 && < 4.10+ , criterion+ , monoid-extras
+ src/Data/Monoid/SemiDirectProduct.hs view
@@ -0,0 +1,50 @@+{-# LANGUAGE FlexibleInstances #-}+{-# LANGUAGE MultiParamTypeClasses #-}+{-# LANGUAGE TupleSections #-}+{-# LANGUAGE CPP #-}++module Data.Monoid.SemiDirectProduct+ ( Semi, quotient, inject, embed+ ) where++#if !MIN_VERSION_base(4,8,0)+import Data.Monoid+#endif++import Data.Monoid.Action++-- | The semi-direct product of monoids @s@ and @m@. When the monoid+-- @m@ acts on the monoid @s@, this type acquires a monoid structure.+-- We call the monoid @m@ the quotient monoid and the monoid @s@ the+-- sub-monoid of the semi-direct product. The semi-direct product+-- @Semi s m@ is an extension of the monoid @s@ with @m@ being the+-- quotient.+newtype Semi s m = Semi { unSemi :: (s,m) }+++instance (Monoid m, Monoid s, Action m s) => Monoid (Semi s m) where+ mempty = Semi (mempty, mempty)+ {-# INLINE mempty #-}++ mappend x y = Semi (xs `mappend` (xm `act` ys), xm `mappend` ym)+ where (xs, xm) = unSemi x+ (ys, ym) = unSemi y++ {-# INLINE mappend #-}+ mconcat = foldr mappend mempty+ {-# INLINE mconcat #-}++-- | The quotient map.+quotient :: Semi s m -> m+quotient = snd . unSemi++-- | The injection map.+inject :: Monoid m => s -> Semi s m+inject = Semi . (,mempty)++-- | The semi-direct product gives a split extension of @s@ by+-- @m@. This allows us to embed @m@ into the semi-direct product. This+-- is the embedding map. The quotient and embed maps should satisfy+-- the equation @quotient . embed = id@.+embed :: Monoid s => m -> Semi s m+embed = Semi . (mempty,)
+ src/Data/Monoid/SemiDirectProduct/Strict.hs view
@@ -0,0 +1,50 @@+-- | A strict version of the semi-direct product. If a monoid m acts+-- on s then this version of the semi-direct product is strict in the+-- m-portion of the semi-direct product.++{-# LANGUAGE FlexibleInstances #-}+{-# LANGUAGE MultiParamTypeClasses #-}+{-# LANGUAGE TupleSections #-}+{-# LANGUAGE CPP #-}++module Data.Monoid.SemiDirectProduct.Strict+ ( Semi, quotient, inject, embed+ ) where++#if !MIN_VERSION_base(4,8,0)+import Data.Monoid+#endif++import Data.Monoid.Action++-- | The semi-direct product of monoids @s@ and @m@. When the monoid+-- @m@ acts on the monoid @s@, this type acquires a monoid structure.+-- We call the monoid @m@ the quotient monoid and the monoid @s@ the+-- sub-monoid of the semi-direct product. The semi-direct product+-- @Semi s m@ is an extension of the monoid @s@ with @m@ being the+-- quotient.+data Semi s m = Semi s !m+++instance (Monoid m, Monoid s, Action m s) => Monoid (Semi s m) where+ mempty = Semi mempty mempty+ {-# INLINE mempty #-}+ mappend (Semi xs xm) (Semi ys ym) = Semi (xs `mappend` (xm `act` ys)) (xm `mappend` ym)+ {-# INLINE mappend #-}+ mconcat = foldr mappend mempty+ {-# INLINE mconcat #-}+ +-- | The quotient map.+quotient :: Semi s m -> m+quotient (Semi _ m) = m++-- | The injection map.+inject :: Monoid m => s -> Semi s m+inject = flip Semi mempty++-- | The semi-direct product gives a split extension of @s@ by+-- @m@. This allows us to embed @m@ into the semi-direct product. This+-- is the embedding map. The quotient and embed maps should satisfy+-- the equation @quotient . embed = id@.+embed :: Monoid s => m -> Semi s m+embed = Semi mempty