function createCursor(start) { let cursor = start; let lastMovement = 0; return { get() { return cursor; }, set(newPosition) { cursor = newPosition; }, getId(store) { return store.currentID(cursor) }, atFirst() { return cursor === 0; }, atPosition(other) { return cursor === other; }, atEnd(store) { return cursor === store.length() }, hasMoved(saved) { return cursor !== saved.get() }, getCurrent(store) { let id = store.currentID(cursor) return store.value(id) }, getCurrentElement(elements) { return elements.slice(cursor, cursor + 1); }, save() { return createCursor(cursor); }, moveUp(store) { cursor = store.prevCursorPosition(cursor) lastMovement = -1 }, moveDown(store) { cursor = store.nextCursorPosition(cursor, true) lastMovement = 1 }, remove(store) { let id = store.currentID(cursor) let item = store.value(id) store.remove(cursor) if (cursor >= store.length()) { cursor = store.length() - 1 } }, insertAbove(store, item) { store.insertBefore(store.currentID(cursor), item) }, insertBelow(store, item) { let currentID = store.currentID(cursor) let currentItem = store.value(currentID) if (currentItem.fold !== 'open') { cursor = store.lastHigherIndented(cursor) item.indented = currentItem.indented cursor-- } let id = store.insertAfter(store.currentID(cursor), item) cursor = store.index(id) }, forwardToNextVisible(store) { cursor = store.nextCursorPosition(cursor, false) }, lastDir() { return lastMovement }, resetLastMove() { lastMovement = 0 } }; } export default createCursor;