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.