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 | 3x 29069x 29067x 5544x 5544x 23523x 23523x 23523x 11383x 4601x 3563x 2276x 6782x 11383x 6927x 4915x 6927x 5213x 3848x 5213x 3x 14178x 7272x 3914x 2992x 3x 5947x 3097x 1336x 1514x 3x 3390x 3382x 3382x 3382x 3x 2169x 2169x 8912x 2169x 2169x 3x 6653x 3075x 2067x 2067x 1511x 1511x 1511x | import type {StringOp, StringOpComponent} from './types'; export const append = (op: StringOp, component: StringOpComponent): void => { if (!component) return; if (!op.length) { op.push(component); return; } const lastIndex = op.length - 1; const last = op[lastIndex]; switch (typeof component) { case 'number': { if (typeof last === 'number') { if (component > 0 && last > 0) op[lastIndex] = last + component; else if (component < 0 && last < 0) op[lastIndex] = last + component; else op.push(component); } else op.push(component); break; } case 'string': { if (typeof last === 'string') op[lastIndex] = last + component; else op.push(component); break; } case 'object': { if (last instanceof Array) last[0] = last + component[0]; else op.push(component); break; } } }; export const componentLength = (component: StringOpComponent): number => { switch (typeof component) { case 'number': return Math.abs(component); case 'string': return component.length; default: return component[0].length; } }; export const isDeleteComponent = (component: StringOpComponent): boolean => { switch (typeof component) { case 'number': return component < 0; case 'object': return true; default: return false; } }; export const trim = (op: StringOp): void => { if (!op.length) return; const last = op[op.length - 1]; const isLastRetain = typeof last === 'number' && last > 0; if (isLastRetain) op.pop(); }; export const normalize = (op: StringOp): StringOp => { const op2: StringOp = []; const length = op.length; for (let i = 0; i < length; i++) append(op2, op[i]); trim(op2); return op2; }; /** * Extracts a full or a part of a component from an operation. * * @param component Component from which to extract a chunk. * @param offset Position within the component to start from. * @param maxLength Maximum length of the component to extract. * @returns Full or partial component at index `index` of operation `op`. */ export const chunk = (component: StringOpComponent, offset: number, maxLength: number): StringOpComponent => { switch (typeof component) { case 'number': { return component > 0 ? Math.min(component - offset, maxLength) : -Math.min(-component - offset, maxLength); } case 'string': { const end = Math.min(offset + maxLength, component.length); return component.substring(offset, end); } case 'object': { const str = component[0]; const end = Math.min(offset + maxLength, str.length); return [str.substring(offset, end)]; } } }; |