Press n or j to go to the next uncovered block, b, p or k for the previous block.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 | 1x 1x 106x 106x 106x 106x 106x 106x 106x 1x 1x 51x 51x 1x 1x 160x 6x 160x 1x 1x 159x 11x 159x 148x 148x 159x 1x 1x 106x 104x 104x 104x 106x 8x 8x 8x 96x 96x 96x 96x 106x 1x 1x 19x 19x 33x 33x 10x 10x 10x 19x 1x 1x 141x 141x 1x 1x 1x 1x 1x 1x 106x 106x 1x 1x 1x 254x 254x 1x 1x 1x 1x 1x 1x 1x 106x 106x 106x 106x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 16x 16x 16x 16x 1x 1x 16x 16x 16x 16x | class Action { constructor (name, onRelease) { this._name = name this._onRelease = onRelease this._beforeHandlers = new Set() this._handlers = new Set() this._done = false this._history = [] } get name () { return this._name } valid (handler) { if (!handler.filter) return true return handler.filter(this._name) } add (handler) { if (handler.before) { this._beforeHandlers.add(handler) } else { this._handlers.add(handler) } } done () { if (this._done) return try { this._beforeHandlers.forEach(handler => handler.run(this._name)) } catch (err) { this.cancel() throw err } this._done = true this._onRelease() this._handlers.forEach(handler => handler.run(this._name)) } cancel () { if (this._done) return for (let i = this._history.length - 1; i >= 0; i--) { this._history[i]() } this._history = [] this._done = true this._onRelease() } pushHistory (rollback) { this._history.push(rollback) } } export class ActionManager { constructor () { this._stack = [] this._onRelease = () => { this._stack.pop() } } get current () { return this._stack[this._stack.length - 1] } /** * * @param {string | symbol | number} name * @returns */ create (name = '_') { const action = new Action(name, this._onRelease) this._stack.push(action) return action } } export const actions = new ActionManager() /** * Create a action * @param {function} handler * @param {string} [actionName] */ export function action (handler, actionName) { const action = actions.create(actionName) try { handler(() => action.cancel()) } catch (err) { action.cancel() throw err } finally { action.done() } } |