diff options
| author | rxliuli <rxliuli@gmail.com> | 2025-11-04 05:03:50 +0800 |
|---|---|---|
| committer | rxliuli <rxliuli@gmail.com> | 2025-11-04 05:03:50 +0800 |
| commit | bce557cc2dc767628bed6aac87301a1be7c5431b (patch) | |
| tree | b51a051228d01fe3306cd7626d4a96768aadb944 /node_modules/@jet/environment/json/reader/object-cursor.js | |
init commit
Diffstat (limited to 'node_modules/@jet/environment/json/reader/object-cursor.js')
| -rw-r--r-- | node_modules/@jet/environment/json/reader/object-cursor.js | 119 |
1 files changed, 119 insertions, 0 deletions
diff --git a/node_modules/@jet/environment/json/reader/object-cursor.js b/node_modules/@jet/environment/json/reader/object-cursor.js new file mode 100644 index 0000000..8ac84f2 --- /dev/null +++ b/node_modules/@jet/environment/json/reader/object-cursor.js @@ -0,0 +1,119 @@ +"use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); +exports.ObjectCursor = void 0; +const optional_1 = require("../../types/optional"); +const clone_1 = require("../../util/clone"); +const key_path_1 = require("./key-path"); +const traverse_1 = require("./traverse"); +class ObjectCursor { + /** + * Create a cursor for an object. + * + * @param root - An object to traverse. + */ + constructor(root) { + this.values = [root]; + this.keyPaths = [key_path_1.thisKeyPath]; + this.savedDepths = []; + } + /** + * The current value this cursor is pointing at. + */ + get currentValue() { + return this.values[this.values.length - 1]; + } + /** + * The key path of the value this cursor is pointing at. + */ + get currentKeyPath() { + return this.keyPaths[this.keyPaths.length - 1]; + } + /** + * Advance this cursor to a given value and the key path which + * was used to reach it. + * + * Use this method to override the internal traversal logic of + * the cursor as needed. Like `moveTo`, calls to this method can + * be balanced with calls to `back`. + * + * @param value - The new value for the cursor to represent. + * @param keyPath - The key path used to reach the value. + */ + interject(value, keyPath) { + this.values.push(value); + this.keyPaths.push(keyPath); + } + /** + * Reconfigure this cursor to traverse a given object. + * + * @param newRoot - The new root object to traverse. + * @param keyPath - The key path specifying where the root object came from. + * Typically this should be `thisKeyPath` (the default value for this parameter.) + */ + reuse(newRoot, keyPath = key_path_1.thisKeyPath) { + this.values.length = 0; + this.values.push(newRoot); + this.keyPaths.length = 0; + this.keyPaths.push(keyPath); + this.savedDepths.length = 0; + } + /** + * Advance this cursor to a new position in the object it is traversing, + * saving its previous position so that the cursor may be moved back. + * + * @param keyPath - A key path referring to a location in the cursor's current value. + * @returns The new current value of the cursor. + */ + moveTo(keyPath) { + const newValue = (0, traverse_1.traverse)(this.currentValue, keyPath); + this.values.push(newValue); + this.keyPaths.push(keyPath); + return newValue; + } + /** + * Rewind this cursor to its previous position in the object it is traversing. + */ + moveBack() { + const currentDepth = this.values.length; + if (currentDepth === 1) { + throw new Error("Cannot move back past the root of a cursor"); + } + const numberOfSaves = this.savedDepths.length; + if (numberOfSaves > 0 && currentDepth <= this.savedDepths[numberOfSaves - 1]) { + throw new Error("Cannot move back past the most recent saved state"); + } + this.values.pop(); + this.keyPaths.pop(); + } + /** + * Save the current position of this cursor so that it may be restored later. + * + * Calls to this method must be balanced with a call to `restoreState`. + */ + saveState() { + this.savedDepths.push(this.values.length); + } + /** + * Restore this cursor's position to a previously saved state. + * + * Use this method to balance a previous call to `saveState`. + */ + restoreState() { + const savedLength = this.savedDepths.pop(); + if ((0, optional_1.isNothing)(savedLength)) { + throw new Error("Calls to restoreState must balance previous calls to saveState"); + } + this.values.length = savedLength; + this.keyPaths.length = savedLength; + } + // section Cloneable + clone() { + const copy = (0, clone_1.shallowCloneOf)(this); + copy.values = this.values.slice(); + copy.keyPaths = this.keyPaths.slice(); + copy.savedDepths = this.savedDepths.slice(); + return copy; + } +} +exports.ObjectCursor = ObjectCursor; +//# sourceMappingURL=object-cursor.js.map
\ No newline at end of file |
