mutate
Apply a local mutation expressed as a transform on the current state. Equivalent to apply(state.value.let(transform)) but avoids reading state.value at every call site.
tally.mutate { it.increment(replica, 3L) }Content copied to clipboard
Throws
if this replicator has been closed.
Samples
runTest(
StandardTestDispatcher(),
timeout = 5.seconds,
) {
val loom = InMemoryLoom()
val seamAlice = loom.host(Pattern("vote-tally"))
val seamBob = loom.join(InMemoryTag("bob"))
// No manual QuiltMessage.serializer(...) wrapping needed.
val cfg = QuilterConfig(expectVirtualTime = true)
val aliceTally = Quilter(seamAlice, PNCounter.ZERO, PNCounter.serializer(), backgroundScope, config = cfg)
val bobTally = Quilter(seamBob, PNCounter.ZERO, PNCounter.serializer(), backgroundScope, config = cfg)
kotlinx.coroutines.delay(1)
// mutate removes the state.value repetition at every call site.
aliceTally.mutate { it.increment(aliceTally.replica, 3L) }
bobTally.mutate { it.decrement(bobTally.replica, 1L) }
kotlinx.coroutines.delay(10)
assertEquals(2L, aliceTally.state.value.value)
assertEquals(aliceTally.state.value.value, bobTally.state.value.value)
}Content copied to clipboard