Skip to content

Instantly share code, notes, and snippets.

@ushiboy
Created September 8, 2018 02:47
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save ushiboy/61affc2ed71572e8d0b6a10be5baf5ef to your computer and use it in GitHub Desktop.
Save ushiboy/61affc2ed71572e8d0b6a10be5baf5ef to your computer and use it in GitHub Desktop.
recordもどき
function toRecord(origin) {
function check(lock, prop) {
if (!lock) {
throw new Error('Changes outside $mutate');
} else if (prop === '$mutate') {
throw new Error('$mutate can never be changed');
}
}
function convert(src) {
let lock = false;
let copy;
src.$mutate = fn => {
copy = Object.assign({}, src);
lock = true;
fn();
lock = false;
return convert(copy);
};
return new Proxy(src, {
set(_, prop, value) {
check(lock, prop);
copy[prop] = value;
return true;
},
deleteProperty(_, prop) {
check(lock, prop);
delete copy[prop];
return true;
}
});
}
return convert(Object.assign({}, origin));
}
const origin = {
count: 0,
name: 'test'
};
console.log('origin to record1');
const record1 = toRecord(origin);
console.log('origin', JSON.stringify(origin));
console.log('record1', JSON.stringify(record1));
try {
// direct
record1.count = 1;
} catch (e) {
console.log(e);
}
console.log('record1 to record2 ( record1 | count = 1 )');
const record2 = record1.$mutate(() => {
record1.count = 1;
});
console.log('origin', JSON.stringify(origin));
console.log('record1', JSON.stringify(record1));
console.log('record2', JSON.stringify(record2));
console.log('record2 to record3 ( record2 | count = 2, name = test2 )');
const record3 = record2.$mutate(() => {
record2.count = 2;
record2.name = 'test2';
});
console.log('origin', JSON.stringify(origin));
console.log('record1', JSON.stringify(record1));
console.log('record2', JSON.stringify(record2));
console.log('record3', JSON.stringify(record3));
console.log('record1 to record4 ( delete name property )');
const record4 = record1.$mutate(() => {
delete record1.name;
});
console.log('origin', JSON.stringify(origin));
console.log('record1', JSON.stringify(record1));
console.log('record2', JSON.stringify(record2));
console.log('record3', JSON.stringify(record3));
console.log('record4', JSON.stringify(record4));
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment