UNPKG

transmutable

Version:

immutable objects that pretend to be mutable

134 lines (111 loc) 3.54 kB
'use strict'; var assert = require('assert'); var _require = require('.'), transform = _require.transform; //const { State } = require('../mea/state'); var _require2 = require('./testUtils'), createExample = _require2.createExample; var immer = require('immer').default; var _require3 = require('immer'), setAutoFreeze = _require3.setAutoFreeze, setUseProxies = _require3.setUseProxies; var _require4 = require('./docData'), benchmarks = _require4.benchmarks; setAutoFreeze(false); var max = benchmarks.max; var original = { arr: [] }; var HOW_MANY_OBJECTS_TO_PUSH = 100; for (var i = 0; i < 1000; i++) { original.arr.push({ a: i }); } function transformer(state) { // for (let i = 0; i < 100; i++) { // state['o' + i] = Object.assign({}, state.arr[1]); // } for (var _i = 0; _i < HOW_MANY_OBJECTS_TO_PUSH; _i++) { state.arr[_i].done = true; } } function benchmark(code, name) { var t0 = Date.now(); var res = void 0; for (var _i2 = 0; _i2 < max; _i2++) { res = code(); } //console.log(original.arr.length, res.arr.length) var t1 = Date.now(); console.log('* Time for ' + name + ': ', t1 - t0 + 'ms'); } console.log('\nchanging ' + HOW_MANY_OBJECTS_TO_PUSH + ' objects in array of ' + original.arr.length + ' items. Repeated ' + max + ' times.\n'); console.log('\nES6 Proxies\n'); benchmark(function () { return transform(transformer, original); }, 'transmutable (ES6 - Proxy)'); benchmark(function () { return immer(original, transformer); }, 'immer (ES6 - proxies, without autofreeze)'); console.log("\nES5 fallback\n"); benchmark(function () { var P = Proxy; Proxy = undefined; transform(transformer, original); Proxy = P; }, 'transmutable (ES5 - diffing)'); benchmark(function () { setUseProxies(false); immer(original, transformer); setUseProxies(true); }, 'immer (ES5 - getters/setters, without autofreeze)'); // benchmark(() => { // const state = new State(original); // state.run(transformer); // return state.get(); // }, 'transmutable (State object)- array') // console.log('\nupdating arbitrary object, one nested update. Repeated ' + max + ' times\n'); console.log("\nES6 Proxies\n"); benchmark(function () { return transform(function (state) { state.c.d = {}; }, createExample()); }, 'transmutable (ES6 - proxies)'); benchmark(function () { return immer(createExample(), function (state) { state.c.d = {}; }); }, 'immer - (ES6 - proxies, without autofreeze)'); console.log("\nES5 fallback\n"); // TODO tests should be both (ES6 and ES5) for transmutable and immer. benchmark(function () { var P = Proxy; Proxy = undefined; transform(function (state) { state.c.d = {}; }, createExample()); Proxy = P; }, 'transmutable (ES5 - diffing) - example'); benchmark(function () { setUseProxies(false); immer(createExample(), function (state) { state.c.d = {}; }); setUseProxies(true); }, 'immer - (ES5 - getters/setters, without autofreeze)'); var state = createExample(); // benchmark(() => { // // const res = Object.assign( // {}, // state, // {c: Object.assign({}, state.c, {d: {}})}, // ) // // // const expected = createExample(); // // expected.c.d = {}; // // assert.deepStrictEqual(res, expected); // return res; // // return transform((state) => { // // state.c.d = {}; // // }, ); // }, 'hand crafted - example')