export type ArraySwapDelta<State> = {
  [Key in ArrayKeys<State>]: {
    __brand__: typeof arraySwapTag;
    name: Key;
    index1: number;
    index2: number;
  };
}[ArrayKeys<State>];

export function createArraySwapDelta<State, Key extends ArrayKeys<State>>(
  name: Key,
  index1: number,
  index2: number,
): ArraySwapDelta<State> {
  return { __brand__: arraySwapTag, name, index1, index2 } as ArraySwapDelta<State>;
}

export function createArraySwapOperation<State>(): DeltaOperation<State, ArraySwapDelta<State>> {
  return {
    forward: (state, { name, index1, index2 }) => {
      const array = state[name] as ArrayElement<State[typeof name]>[];
      [array[index1], array[index2]] = [array[index2]!, array[index1]!];
    },
    backward: (state, { name, index1, index2 }) => {
      const array = state[name] as ArrayElement<State[typeof name]>[];
      [array[index1], array[index2]] = [array[index2]!, array[index1]!];
    },
  } as DeltaOperation<State, ArraySwapDelta<State>>;
}