public function synchronized(callable $callback) : \Generator
{
/** @var \Icicle\Concurrent\Sync\Lock $lock */
$lock = (yield from $this->mutex->acquire());
try {
$value = $this->unwrap();
$result = (yield $callback($value));
$this->wrap(null === $result ? $value : $result);
} finally {
$lock->release();
}
return $result;
}