diff --git a/crdt.cabal b/crdt.cabal
--- a/crdt.cabal
+++ b/crdt.cabal
@@ -3,7 +3,7 @@
 -- see: https://github.com/sol/hpack
 
 name:           crdt
-version:        3.0
+version:        4.0
 synopsis:       Conflict-free replicated data types
 description:    Definitions of CmRDT and CvRDT. Implementations for some classic CRDTs.
 category:       Distributed Systems
diff --git a/lib/CRDT/Cm.hs b/lib/CRDT/Cm.hs
--- a/lib/CRDT/Cm.hs
+++ b/lib/CRDT/Cm.hs
@@ -13,12 +13,12 @@
 -- | Partial order for causal semantics.
 -- Values of some type may be ordered and causally-ordered different ways.
 class CausalOrd a where
-    -- | @x `affects` y@ means that
+    -- | @x `precedes` y@ means that
     -- @x@ must go before @y@ and @y@ can not go before @x@.
-    affects :: a -> a -> Bool
+    precedes :: a -> a -> Bool
 
 comparable :: CausalOrd a => a -> a -> Bool
-comparable a b = a `affects` b || b `affects` a
+comparable a b = a `precedes` b || b `precedes` a
 
 -- | Not comparable, i. e. ¬(a ≤ b) ∧ ¬(b ≤ a).
 concurrent :: CausalOrd a => a -> a -> Bool
diff --git a/lib/CRDT/Cm/Counter.hs b/lib/CRDT/Cm/Counter.hs
--- a/lib/CRDT/Cm/Counter.hs
+++ b/lib/CRDT/Cm/Counter.hs
@@ -21,4 +21,4 @@
 
 -- | Empty order, allowing arbitrary reordering
 instance CausalOrd (Counter a) where
-    affects _ _ = False
+    precedes _ _ = False
diff --git a/lib/CRDT/Cm/GSet.hs b/lib/CRDT/Cm/GSet.hs
--- a/lib/CRDT/Cm/GSet.hs
+++ b/lib/CRDT/Cm/GSet.hs
@@ -18,4 +18,4 @@
     apply (Add a) = Set.insert a
 
 instance Eq a => CausalOrd (GSet a) where
-    affects _ _ = False
+    precedes _ _ = False
diff --git a/lib/CRDT/Cm/TwoPSet.hs b/lib/CRDT/Cm/TwoPSet.hs
--- a/lib/CRDT/Cm/TwoPSet.hs
+++ b/lib/CRDT/Cm/TwoPSet.hs
@@ -27,5 +27,5 @@
         Remove a  -> Set.delete a
 
 instance Eq a => CausalOrd (TwoPSet a) where
-    Remove a `affects` Add b = a == b -- `Remove e` can occur only after `Add e`
-    _        `affects` _     = False  -- Any other are not ordered
+    Add b `precedes` Remove a = a == b -- `Remove e` can occur only after `Add e`
+    _     `precedes` _        = False  -- Any other are not ordered
diff --git a/lib/CRDT/LWW.hs b/lib/CRDT/LWW.hs
--- a/lib/CRDT/LWW.hs
+++ b/lib/CRDT/LWW.hs
@@ -64,7 +64,7 @@
 -- CmRDT -----------------------------------------------------------------------
 
 instance CausalOrd (LWW a) where
-    affects _ _ = False
+    precedes _ _ = False
 
 instance Eq a => CmRDT (LWW a) where
     type Intent  (LWW a) = a
diff --git a/test/Laws.hs b/test/Laws.hs
--- a/test/Laws.hs
+++ b/test/Laws.hs
@@ -10,6 +10,7 @@
     ) where
 
 import           Control.Monad.State.Strict (StateT, evalStateT)
+import           Data.Maybe (fromMaybe)
 import           Data.Semigroup (Semigroup, (<>))
 import           Test.QuickCheck (Arbitrary (..), Gen, Property, discard,
                                   forAll, property, (===), (==>))
@@ -72,17 +73,15 @@
     )
     => Property
 cmrdtLaw = property $ \(s :: Payload op) in1 in2 pid1 pid2 ->
-    whenJust (makeOp @op in1 s) $ \getOp1 ->
-    whenJust (makeOp @op in2 s) $ \getOp2 -> let
-        (op1, op2) =
-            runLamportClock $
-            (,) <$> runProcess pid1 getOp1 <*> runProcess pid2 getOp2
-        in
-        concurrent op1 op2 ==>
+    fromMaybe discard $ do
+        getOp1 <- makeOp @op in1 s
+        getOp2 <- makeOp @op in2 s
+        let (op1, op2) =
+                runLamportClock $
+                (,) <$> runProcess pid1 getOp1 <*> runProcess pid2 getOp2
+        pure $
+            concurrent op1 op2 ==>
             (apply op1 . apply op2) s === (apply op2 . apply op1) s
-  where
-    whenJust Nothing  _ = discard
-    whenJust (Just a) f = f a
 
 uncurry3 :: (a -> b -> c -> d) -> (a, b, c) -> d
 uncurry3 f (a, b, c) = f a b c
