12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152 |
- 'use strict';
- const unique = arr => arr.filter((v, i) => arr.lastIndexOf(v) === i);
- const compact = arr => unique(arr).filter(Boolean);
- module.exports = (action, data = {}, value = '') => {
- let { past = [], present = '' } = data;
- let rest, prev;
- switch (action) {
- case 'prev':
- case 'undo':
- rest = past.slice(0, past.length - 1);
- prev = past[past.length - 1] || '';
- return {
- past: compact([value, ...rest]),
- present: prev
- };
- case 'next':
- case 'redo':
- rest = past.slice(1);
- prev = past[0] || '';
- return {
- past: compact([...rest, value]),
- present: prev
- };
- case 'save':
- return {
- past: compact([...past, value]),
- present: ''
- };
- case 'remove':
- prev = compact(past.filter(v => v !== value));
- present = '';
- if (prev.length) {
- present = prev.pop();
- }
- return {
- past: prev,
- present
- };
- default: {
- throw new Error(`Invalid action: "${action}"`);
- }
- }
- };
|