Modify the contents of a 
MutVar#, returning the previous
contents 
x :: a and the result of applying the given function
to the previous contents 
f x :: c.
The 
data type 
c (not a 
newtype!) must be a
record whose first field is of lifted type 
a :: Type and is
not unpacked. For example, product types 
c ~ Solo a or 
c
~ (a, b) work well. If the record type is both monomorphic and
strict in its first field, it's recommended to mark the latter 
{-#
NOUNPACK #-} explicitly.
Under the hood 
atomicModifyMutVar2# atomically replaces a
pointer to an old 
x :: a with a pointer to a selector thunk
fst r, where 
fst is a selector for the first field
of the record and 
r is a function application thunk 
r = f
x.
atomicModifyIORef2Native from 
atomic-modify-general
package makes an effort to reflect restrictions on 
c
faithfully, providing a well-typed high-level wrapper.