createCaseReducers is a helper to reduce the overhead in defining case reducers for @reduxjs/toolkit slices, particularly when there is code shared between case reducers.

Example usage:

interface FooState {
  values: number[];
  selectedIndex?: number;
}

const initialState: FooState = { values: [] };

const buildProducers = (state: FooState) => {
  const deselect = () => {
    state.selectedIndex = undefined;
  };

  const select = (index: number) => {
    state.selectedIndex = index;
  };

  const appendValue = (value: number) => {
    state.values.push(value);
    select(state.values.length - 1);
  };

  return {
    deselect,
    select,
    appendValue,
  };
};

const fooSlice = createSlice({
  name: 'foo',
  initialState,
  reducers: createCaseReducers(buildProducers, initialState),
});

The producers factory is called each time an action is dispatched which could potentially have a performance impact if actions are dispatched rapidly. This has not been thoroughly tested.