Skip to content
Snippets Groups Projects
Commit ff5ff16f authored by Alexander Rose's avatar Alexander Rose
Browse files

Merge branch 'master' into gl-geo

parents e3468418 63d1a342
No related branches found
No related tags found
No related merge requests found
......@@ -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 };
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment