來自:ywsing0
時間:Thu 2018-10-11 15:19:40
弄了一個 fluent 形式的「顯微鏡」組合子來作 immutable updates.
例如
let upd0 = lens().key('t').apply(t => t + 1);
let upd1 = lens().key('vscroll').key('vms').index(3).apply(vm => Math.random().toString());
setInterval(() => renderAgain(rd_vm, upd0), 1000);
setInterval(() => renderAgain(rd_vm, upd1), 3000);
這居然花了我大半天!
詳情在 fun.js...
let lens_ = gp => {
return {
apply: f => object0 => {
let { g: object1, p, } = gp(object0);
return p(f(object1));
},
index: index => lens_(object0 => {
let { g: object1, p, } = gp(object0);
return {
g: object1[index],
p: value => p([...object1.slice(0, index), value, ...object1.slice(index + 1, object1.length),]),
};
}),
key: key => lens_(object0 => {
let { g: object1, p, } = gp(object0);
return {
g: object1[key],
p: value => p({ ...object1, [key]: value, }),
};
}),
};
};
let lens = () => lens_(object => ({ g: object, p: value => value, }));