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>>;
}