Immer
This doc describes `jotai/immer` bundle.
Install
You have to install immer to access this bundle and its functions.
npm install immer
# or
yarn add immeratomWithImmer
atomWithImmer creates a new atom similar to the regular atom [atom] with a different writeFunction. In this bundle, we don't have read-only atoms, because the point of these functions is the immer produce(mutability) function.
The signature of writeFunction is (get, set, update: (draft: Draft<Value>) => void) => void.
import { useAtom } from 'jotai'
import { atomWithImmer } from 'jotai/immer'
const countAtom = atomWithImmer(0)
const Counter = () => {
  const [count] = useAtom(countAtom)
  return <div>count: {count}</div>
}
const Controls = () => {
  const [, setCount] = useAtom(setCountAtom)
  // setCount === update : (draft: Draft<Value>) => void
  const inc = () => setCount((c) => (c = c + 1))
  return <button onClick={inc}>+1</button>
}
Examples
Check examples with atomWithImmer:
withImmer
withImmer takes an atom and returns a derived atom, same as atomWithImmer it has a different writeFunction.
import { useAtom, atom } from 'jotai'
import { withImmer } from 'jotai/immer'
const primitiveAtom = atom(0)
const countAtom = withImmer(primitiveAtom)
const Counter = () => {
  const [count] = useAtom(countAtom)
  return <div>count: {count}</div>
}
const Controls = () => {
  const [, setCount] = useAtom(setCountAtom)
  // setCount === update : (draft: Draft<Value>) => void
  const inc = () => setCount((c) => (c = c + 1))
  return <button onClick={inc}>+1</button>
}
useImmerAtom
This hook takes an atom and replaces the atom's writeFunction with the new immer-like writeFunction like the previous helpers.
import { useAtom } from 'jotai'
import { useImmerAtom } from 'jotai/immer'
const primitiveAtom = atom(0)
const Counter = () => {
  const [count] = useImmerAtom(primitiveAtom)
  return <div>count: {count}</div>
}
const Controls = () => {
  const [, setCount] = useImmerAtom(primitiveAtom)
  // setCount === update : (draft: Draft<Value>) => void
  const inc = () => setCount((c) => (c = c + 1))
  return <button onClick={inc}>+1</button>
}
It would be better if you don't use withImmer and atomWithImmer with useImmerAtom because they provide the immer-like writeFunction and we don't need to create a new one.
Codesandbox
A good example of this bundle in codesandbox.