diff --git a/src/mol-util/value-cell.ts b/src/mol-util/value-cell.ts index 762bcbf7e723970b2f755d6658cddc3efba52675..ef5a0a33813b35303b3a008b1de085ee29d75b5a 100644 --- a/src/mol-util/value-cell.ts +++ b/src/mol-util/value-cell.ts @@ -9,15 +9,25 @@ interface ValueCell<T> { value: T } /** Create a mutable value cell. */ function ValueCell<T>(value: T): ValueCell<T> { return { value }; } +let _valueBoxId = 0; +function getNextId() { + return _valueBoxId++ % 0x7FFFFFFF; +} + /** An immutable value box that also holds a version of the attribute. */ -interface ValueBox<T> { readonly version: number, readonly value: T } +interface ValueBox<T> { + // Unique identifier in the range 0 to 0x7FFFFFFF + readonly id: number, + readonly version: number, + readonly value: T +} /** Create a new box with the specified value and version = 0 */ function ValueBox<T>(value: T): ValueBox<T> /** Create a new box by updating the value of an old box and incrementing the version number. */ function ValueBox<T>(box: ValueBox<T>, value: T): ValueBox<T> function ValueBox<T>(boxOrValue: T | ValueBox<T>, value?: T): ValueBox<T> { - if (arguments.length === 2) return { version: (boxOrValue as ValueBox<T>).version + 1, value: value! }; - return { version: 0, value: boxOrValue as T }; + if (arguments.length === 2) return { id: (boxOrValue as ValueBox<T>).id, version: (boxOrValue as ValueBox<T>).version + 1, value: value! }; + return { id: getNextId(), version: 0, value: boxOrValue as T }; } export { ValueCell, ValueBox };