diff --git a/GraphRewriting/Rule.hs b/GraphRewriting/Rule.hs
--- a/GraphRewriting/Rule.hs
+++ b/GraphRewriting/Rule.hs
@@ -1,4 +1,4 @@
-{-# LANGUAGE UnicodeSyntax, TypeSynonymInstances, FlexibleInstances, MultiParamTypeClasses, FlexibleContexts #-}
+{-# LANGUAGE UnicodeSyntax, FlexibleInstances, FlexibleContexts #-}
 -- | Rewrite rules are represented as nested monads: a 'Rule' is a 'Pattern' that returns a 'Rewrite' the latter directly defining the transformation of the graph.
 --
 -- For rule construction a few functions a provided: The most basic one is 'rewrite'. But in most cases 'erase', 'rewire', and 'replace*' should be more convenient. These functions express rewrites that /replace/ the matched nodes of the 'Pattern', which comes quite close to the @L -> R@ form in which graph rewriting rules are usually expressed.
@@ -23,9 +23,15 @@
 
 -- | Apply rule at an arbitrary position if applicable
 apply ∷ Rule n → Rewrite n ()
-apply r = do
+apply = void . apply'
+
+-- | Apply rule at an arbitrary position. Return value states whether the rule was applicable.
+apply' ∷ Rule n → Rewrite n Bool
+apply' r = do
 	contractions ← evalPattern r <$> ask
-	when (not $ null contractions) (head contractions >> return ())
+	if null contractions
+		then return False
+		else head contractions >> return True
 
 -- rule construction ---------------------------------------------------------
 
@@ -115,3 +121,20 @@
 everywhere r = do
 	ms ← amnesia $ matches r
 	exhaustive $ restrictOverlap (\hist future → future ∈ ms) r
+
+-- TODO: how lazy is this? can it be done lazier?
+-- | Repeatedly apply the rules from the given list prefering earlier entries.
+-- Returns a list of indexes reporting the sequence of rules that has applied.
+benchmark ∷ [Rule n] → Rewrite n [Int]
+benchmark rules = rec where
+
+	rec = do
+		contractions ← evalPattern (anyOf indexedRules) <$> ask
+		case contractions of
+			[] → return []
+			(i,rw) : _ → fmap (i:) (rw >> rec)
+
+	indexedRules = zipWith addIndex [0..] rules where
+		addIndex i rule = do
+			rw ← rule
+			return (i, rw)
diff --git a/graph-rewriting.cabal b/graph-rewriting.cabal
--- a/graph-rewriting.cabal
+++ b/graph-rewriting.cabal
@@ -1,5 +1,5 @@
 Name:           graph-rewriting
-Version:        0.7.0
+Version:        0.7.1
 Copyright:      (c) 2010, Jan Rochel
 License:        BSD3
 License-File:   LICENSE
