reducers 0.1 → 0.1.1
raw patch · 4 files changed
+27/−10 lines, 4 filesdep +comonaddep +keysdep +pointed
Dependencies added: comonad, keys, pointed
Files
- Data/Semigroup/Applicative.hs +2/−3
- Data/Semigroup/Apply.hs +3/−3
- Data/Semigroup/Reducer.hs +17/−2
- reducers.cabal +5/−2
Data/Semigroup/Applicative.hs view
@@ -19,7 +19,6 @@ ) where import Control.Applicative-import Control.Monad (void) import Data.Monoid (Monoid(..)) import Data.Semigroup (Semigroup(..)) import Data.Semigroup.Reducer (Reducer(..))@@ -37,9 +36,9 @@ Traversal a `mappend` Traversal b = Traversal (a *> b) instance Applicative f => Reducer (f a) (Traversal f) where- unit = Traversal . void+ unit = Traversal . (() <$) a `cons` Traversal b = Traversal (a *> b)- Traversal a `snoc` b = Traversal (void (a *> b))+ Traversal a `snoc` b = Traversal (() <$ (a *> b)) -- | Efficiently avoid needlessly rebinding when using 'snoc' on an action that already returns () -- A rewrite rule automatically applies this when possible
Data/Semigroup/Apply.hs view
@@ -18,7 +18,7 @@ , App(..) ) where -import Control.Monad (void)+import Data.Functor import Data.Functor.Apply import Data.Semigroup (Semigroup(..)) import Data.Semigroup.Reducer (Reducer(..))@@ -32,9 +32,9 @@ Trav a <> Trav b = Trav (a .> b) instance Apply f => Reducer (f a) (Trav f) where- unit = Trav . void+ unit = Trav . (() <$) a `cons` Trav b = Trav (a .> b)- Trav a `snoc` b = Trav (void (a .> b))+ Trav a `snoc` b = Trav (() <$ (a .> b)) -- | Efficiently avoid needlessly rebinding when using 'snoc' on an action that already returns () -- A rewrite rule automatically applies this when possible
Data/Semigroup/Reducer.hs view
@@ -14,12 +14,12 @@ ----------------------------------------------------------------------------- module Data.Semigroup.Reducer- ( Reducer- , unit, snoc, cons+ ( Reducer(..) , foldMapReduce, foldMapReduce1 , foldReduce, foldReduce1 , pureUnit , returnUnit+ , Count(..) ) where import Control.Applicative@@ -92,6 +92,21 @@ pureUnit :: (Applicative f, Reducer c n) => c -> f n pureUnit = pure . unit +newtype Count = Count { getCount :: Int } deriving (Eq,Ord,Show,Read)++instance Semigroup Count where+ Count a <> Count b = Count (a + b)+ replicate1p n (Count a) = Count $ (fromIntegral n + 1) * a++instance Monoid Count where+ mempty = Count 0+ Count a `mappend` Count b = Count (a + b)++instance Reducer a Count where+ unit _ = Count 1+ Count n `snoc` _ = Count (n + 1)+ _ `cons` Count n = Count (n + 1)+ instance (Reducer c m, Reducer c n) => Reducer c (m,n) where unit x = (unit x,unit x) (m,n) `snoc` x = (m `snoc` x, n `snoc` x)
reducers.cabal view
@@ -1,6 +1,6 @@ name: reducers category: Data, Math, Numerical, Semigroups-version: 0.1+version: 0.1.1 license: BSD3 cabal-version: >= 1.6 license-file: LICENSE@@ -30,7 +30,10 @@ parallel >= 3.1 && < 3.2, unordered-containers >= 0.1.4 && < 0.2, semigroups >= 0.7.1 && < 0.8,- semigroupoids >= 1.2.2.4 && < 1.3+ semigroupoids >= 1.2.2.4 && < 1.3,+ comonad >= 1.1.1 && < 1.2,+ pointed >= 2.0 && < 2.1,+ keys >= 2.0 && < 2.1 exposed-modules: Data.Generator