2020-03-28 03:46:34 +08:00

89 lines
2.1 KiB
JavaScript

import Debug from 'debug';
import { fastClone } from './index';
const DEFAULT_CONFIG = {
limit: 20,
};
const debug = Debug('utils:undoRedoHelper');
export default class UndoRedoHelper {
constructor(config) {
this.config = { ...DEFAULT_CONFIG, ...config };
this.data = {};
}
create(key, value, forceCreate) {
if (!this.data[key] || forceCreate) {
this.data[key] = {
list: [fastClone(value)],
idx: 0,
};
}
return this.data[key];
}
delete(key) {
delete this.data[key];
}
resetRecord(key, value) {
const data = this.data[key];
if (!data || !data.list) return;
data.list = data.list.slice(0, data.idx + 1);
data.list[data.idx] = fastClone(value);
}
record(key, value) {
const data = this.data[key];
const limit = this.config.limit;
if (!data || !data.list) return;
data.list = data.list.slice(0, data.idx + 1);
if (data.list.length >= limit) {
data.list.shift();
}
data.list.push(fastClone(value));
++data.idx;
}
undo(key) {
const data = this.data[key];
if (!data || !data.list) return null;
//若没有前置操作,返回当前数据
if (data.idx <= 0) return data.list[data.idx];
--data.idx;
return data.list[data.idx];
}
redo(key) {
const data = this.data[key];
if (!data || !data.list) return null;
//若没有后续操作,返回当前数据
if (data.idx >= data.list.length - 1) return data.list[data.idx];
++data.idx;
return data.list[data.idx];
}
past(key) {
const data = this.data[key];
if (!data || !data.list || data.idx <= 0) return null;
return data.list[data.idx - 1];
}
present(key) {
const data = this.data[key];
if (!data || !data.list) return null;
return data.list[data.idx];
}
future(key) {
const data = this.data[key];
if (!data || !data.list || data.idx >= data.list.length - 1) return null;
return data.list[data.idx + 1];
}
get(key) {
return {
past: this.past(key),
present: this.present(key),
future: this.future(key),
};
}
}