UNPKG

scrivito

Version:

Scrivito is a professional, yet easy to use SaaS Enterprise Content Management Service, built for digital agencies and medium to large businesses. It is completely maintenance-free, cost-effective, and has unprecedented performance and security.

30 lines (24 loc) 939 B
import { ContextContainer } from 'scrivito_sdk/common'; export class CopyOnWriteStore<T> { private readonly valueForReading = new ContextContainer<T>(); constructor(private value: T, private readonly copy: (value: T) => T) {} /** run some code that needs to read the value. * the passed-in `value` is guaranteed not to change, i.e. * any concurrent writes won't become visible. */ read<R>(fn: (value: T) => R): R { const currentValue = this.value; return this.valueForReading.runWith(currentValue, () => fn(currentValue)); } /** run some code that modifies the value. * the modifications will not become visible to concurrent readers. */ write(fn: (value: T) => void) { if (this.valueForReading.current() === this.value) { // if there's currently someone reading the value, // make a copy before writing it this.value = this.copy(this.value); } fn(this.value); } }