diff --git a/CHANGES.md b/CHANGES.md
--- a/CHANGES.md
+++ b/CHANGES.md
@@ -1,3 +1,8 @@
+# v1.2.0.0
+
+Introduce `?=` and `<~`.
+Change fixity of `.=` to `infix 4`.
+
 # v1.1.0.0
 
 Introduce `+=`, `-=`, `*=`, and `//=`.
diff --git a/fused-effects-lens.cabal b/fused-effects-lens.cabal
--- a/fused-effects-lens.cabal
+++ b/fused-effects-lens.cabal
@@ -1,7 +1,7 @@
 cabal-version:       2.4
 
 name:                fused-effects-lens
-version:             1.1.0.0
+version:             1.2.0.0
 synopsis:            Monadic lens combinators for fused-effects.
 description:         Provides combinators for the lens-based manipulation of state and context types provided by the fused-effects library, similar to those provided for mtl-based monad transformers.
 homepage:            https://github.com/fused-effects/fused-effects-lens#readme
@@ -9,8 +9,8 @@
 license-file:        LICENSE
 author:              Patrick Thomson
 maintainer:          patrickt@github.com
-copyright:           2018 Patrick Thomson
-category:            Web
+copyright:           2018-2019 Patrick Thomson
+category:            Control
 build-type:          Simple
 extra-source-files:
   README.md
diff --git a/src/Control/Effect/Lens.hs b/src/Control/Effect/Lens.hs
--- a/src/Control/Effect/Lens.hs
+++ b/src/Control/Effect/Lens.hs
@@ -3,14 +3,20 @@
 -- context types provided by the fused-effects library, similar to
 -- those provided for mtl-based monad transformers.
 module Control.Effect.Lens
-  ( Control.Effect.Lens.view
+  ( -- * Reader accessors
+    Control.Effect.Lens.view
   , views
+    -- * State getters/setters
   , use
   , uses
   , assign
-  , (.=)
   , modifying
+    -- * Infix operators
+  , (.=)
+  , (?=)
   , (%=)
+  , (<~)
+    -- * Mathematical operators
   , (+=)
   , (-=)
   , (*=)
@@ -62,25 +68,38 @@
 assign l b = State.modify (Lens.set l b)
 {-# INLINE assign #-}
 
+-- | Map over the target of a 'Lens', or all of the targets of a @Setter@
+-- or 'Traversal', in the current monadic state.
+--
+-- This is a prefix version of '%='.
+modifying :: forall s a b sig m . (Has (State.State s) sig m) => ASetter s s a b -> (a -> b) -> m ()
+modifying l f = State.modify (Lens.over l f)
+{-# INLINE modifying #-}
+
+infix 4 .=, %=, ?=, +=, -=, *=, //=
+infixr 2 <~
+
 -- | Replace the target of a 'Lens' (or all the targets of a @Setter@
 -- or 'Traversal') within the current monadic state, irrespective of
 -- the old value.
 --
 -- This is an infix version of 'assign'.
-infixr 4 .=
 (.=) :: forall s a b sig m . (Has (State.State s) sig m) => ASetter s s a b -> b -> m ()
 (.=) = assign
 {-# INLINE (.=) #-}
 
--- | Map over the target of a 'Lens', or all of the targets of a @Setter@
--- or 'Traversal', in the current monadic state.
---
--- This is a prefix version of '%='.
-modifying :: forall s a b sig m . (Has (State.State s) sig m) => ASetter s s a b -> (a -> b) -> m ()
-modifying l f = State.modify (Lens.over l f)
-{-# INLINE modifying #-}
+-- | Replace the target of a Lens or all of the targets of a @Setter@ or
+-- 'Traversal' in our monadic state with Just a new value, irrespective
+-- of the old.
+(?=) :: forall s a b sig m . (Has (State.State s) sig m) => ASetter s s a (Maybe b) -> b -> m ()
+setter ?= item = setter .= Just item
+{-# INLINE (?=) #-}
 
-infix 4 %=, +=, -=, *=, //=
+-- | Run a monadic action, and set all of the targets of a 'Lens', @Setter@
+-- or 'Traversal' to its result.
+(<~) :: forall s a b sig m . (Has (State s) sig m) => ASetter s s a b -> m b -> m ()
+setter <~ act = act >>= assign setter
+{-# INLINE (<~) #-}
 
 -- | Map over the target of a 'Lens', or all of the targets of a @Setter@
 -- or 'Traversal', in the current monadic state.
