diff --git a/Data/Parser/Grempa/Grammar/Levels.hs b/Data/Parser/Grempa/Grammar/Levels.hs
--- a/Data/Parser/Grempa/Grammar/Levels.hs
+++ b/Data/Parser/Grempa/Grammar/Levels.hs
@@ -30,9 +30,35 @@
 
 type RStateT s m a = ReverseT (StateT s m) a
 
+-- | Start a levels block. Usage:
+--
+-- > expr <- levels $ do
+-- >   rec
+-- >     e <- lrule [ Plus  <@> e <# '+' <#> t ]
+-- >     t <- lrule [ Times <@> t <# '*' <#> f ]
+-- >     f <- lrule [ Var   <@ 'x'
+-- >                , id    <@ '(' <#> e <# ')']
+-- >   return e
+--
+-- is equivalent to
+--
+-- > e <- rule [ Plus  <@> e <# '+' <#> t 
+-- >           , id    <@> t
+-- >           ]
+-- > t <- rule [ Times <@> t <# '*' <#> f 
+-- >           , id    <@> f
+-- >           ]
+-- > f <- rule [ Var   <@ 'x'
+-- >           , id    <@ '(' <#> e <# ')'
+-- >           ]
+--
+-- Put simply, every lrule save for the last one gets an additional identity
+-- production pointing to the next lrule. This is a common pattern when
+-- creating grammars with precedence levels.
 levels :: Monad m => RStateT (Maybe a) m r -> m r
 levels = flip evalStateT Nothing . runReverseT
 
+-- | A rule in a levels block
 lrule :: (Typeable a, Typeable t)
       => Rule t a
       -> RStateT (Maybe (RId t a)) (GrammarState t) (RId t a)
diff --git a/Grempa.cabal b/Grempa.cabal
--- a/Grempa.cabal
+++ b/Grempa.cabal
@@ -1,5 +1,5 @@
 Name:                Grempa
-Version:             0.1.1
+Version:             0.1.2
 Synopsis:            Embedded grammar DSL and LALR parser generator
 Description:
     A library for expressing programming language grammars in a form similar
