diff --git a/Data/Semigroup/Applicative.hs b/Data/Semigroup/Applicative.hs
--- a/Data/Semigroup/Applicative.hs
+++ b/Data/Semigroup/Applicative.hs
@@ -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
diff --git a/Data/Semigroup/Apply.hs b/Data/Semigroup/Apply.hs
--- a/Data/Semigroup/Apply.hs
+++ b/Data/Semigroup/Apply.hs
@@ -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
diff --git a/Data/Semigroup/Reducer.hs b/Data/Semigroup/Reducer.hs
--- a/Data/Semigroup/Reducer.hs
+++ b/Data/Semigroup/Reducer.hs
@@ -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)
diff --git a/reducers.cabal b/reducers.cabal
--- a/reducers.cabal
+++ b/reducers.cabal
@@ -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
