'use strict' function History () { this.index = 0 this.a = [] this.clear = function () { this.a = [] this.index = 0 } this.push = function (data) { if (this.index < this.a.length - 1) { this.fork() } this.index = this.a.length this.a = this.a.slice(0, this.index) this.a.push(copy(data)) if (this.a.length > 20) { this.a.shift() } } this.fork = function () { this.a = this.a.slice(0, this.index + 1) } this.pop = function () { return this.a.pop() } this.prev = function () { this.index = clamp(this.index - 1, 0, this.a.length - 1) return copy(this.a[this.index]) } this.next = function () { this.index = clamp(this.index + 1, 0, this.a.length - 1) return copy(this.a[this.index]) } function copy (data) { return data ? JSON.parse(JSON.stringify(data)) : [] } function clamp (v, min, max) { return v < min ? min : v > max ? max : v } }