# Advanced Usage (TypeScript) ## Edit Provenance Track which changes came from where using `reconcileWithHistory`: ```javascript const result = reconcileWithHistory( 'Hello world', 'Hello beautiful world', 'Hi world' ); console.log(result.text); // "Hi beautiful world" console.log(result.history); /* [ { "text": "Hello", "history": "RemovedFromRight" }, { "text": "Hi", "history": "AddedFromRight" }, { "text": " beautiful", "history": "AddedFromLeft" }, { "text": " ", "history": "Unchanged" }, { "text": "world", "history": "Unchanged" } ] */ ``` ## Tokenisation Strategies `reconcile-text` offers different approaches to split text for merging: - **Word tokeniser** (`"Word"`) - Splits on word boundaries (recommended for prose) - **Character tokeniser** (`"Character"`) - Individual characters (fine-grained control) - **Line tokeniser** (`"Line"`) - Line-by-line (similar to `git merge` or more precisely [`git merge-file`](https://git-scm.com/docs/git-merge-file)) ## Cursor Tracking `reconcile-text` automatically tracks cursor positions through merges, which is useful for collaborative editors. Selections can be tracked by providing them as a pair of cursors. ```javascript const result = reconcile( 'Hello world', { text: 'Hello beautiful world', cursors: [{ id: 1, position: 6 }], // After "Hello " }, { text: 'Hi world', cursors: [{ id: 2, position: 0 }], // At the beginning } ); // Result: "Hi beautiful world" with repositioned cursors console.log(result.text); // "Hi beautiful world" console.log(result.cursors); // [{ id: 2, position: 0 }, { id: 1, position: 3 }] ``` > The `cursors` list is sorted by character position (not IDs).