pragmatic-fp-ts
Version:
Opinionated functional programming library with easy use in mind
46 lines (45 loc) • 1.52 kB
JavaScript
;
/*
* A mutable value that behaves like a quantum particle: it can be formed until
* the first time it's observed
*/
Object.defineProperty(exports, "__esModule", { value: true });
exports.MutablePrimitive = exports.MutableObject = exports.MutableArray = exports.Mutable = void 0;
const Mutable = (clone) => (initialValue) => {
let value = clone(initialValue);
let wasRead = false;
const preventRaces = () => {
if (wasRead) {
throw new Error("Can not alter mutable value after it was consumed");
}
};
return {
set: (newValue) => {
preventRaces();
value = newValue;
},
update: (fn) => {
preventRaces();
value = fn(value);
},
change: (fn) => {
preventRaces();
fn(value);
},
value: () => {
wasRead = true;
return value;
},
toString: () => `Mutable ${JSON.stringify(value)}`,
};
};
exports.Mutable = Mutable;
const cloneArray = (coll) => coll.concat();
const MutableArray = (coll) => (0, exports.Mutable)(cloneArray)(coll);
exports.MutableArray = MutableArray;
const cloneObject = (obj) => (Object.assign({}, obj));
const MutableObject = (obj) => (0, exports.Mutable)(cloneObject)(obj);
exports.MutableObject = MutableObject;
const clonePrimitive = (value) => value;
const MutablePrimitive = (value) => (0, exports.Mutable)(clonePrimitive)(value);
exports.MutablePrimitive = MutablePrimitive;