diff --git a/src/mol-util/index.ts b/src/mol-util/index.ts index b40fb72acb11c6c1f045ff00d4f698f43d868762..16d00860d8b51105c8e5fd8ac951091612ad895e 100644 --- a/src/mol-util/index.ts +++ b/src/mol-util/index.ts @@ -10,6 +10,7 @@ import StringBuilder from './string-builder' import UUID from './uuid' import Mask from './mask' +export * from './value-cell' export { BitFlags, StringBuilder, UUID, Mask } export function arrayEqual<T>(arr1: T[], arr2: T[]) { diff --git a/src/mol-util/value-cell.ts b/src/mol-util/value-cell.ts new file mode 100644 index 0000000000000000000000000000000000000000..ef5a0a33813b35303b3a008b1de085ee29d75b5a --- /dev/null +++ b/src/mol-util/value-cell.ts @@ -0,0 +1,34 @@ +/** + * Copyright (c) 2018 mol* contributors, licensed under MIT, See LICENSE file for more info. + * + * @author David Sehnal <david.sehnal@gmail.com> + */ + +/** A mutable value cell. */ +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> { + // 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 { 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 }; +