immu-func
v0.1.0
Published
Effective functions to keep data structure immutable
Downloads
9
Maintainers
Readme
ImmuFunc
Effective functions to keep data structure immutable
Install
npm install --save immu-func
Getting Started
Node
let immu = require('immu-func');
Babel
import { setIn } from 'immu-func';
const a = { b: [0, 1, 2, { c: 5 }] }
console.log(setIn(a, ['b', 3, 'c'], 6));
// => { b: [ 0, 1, 2, { c: 6 } ] }
Modify State Tree
import { modifyIn, assign } from 'immu-func';
const stateTree = { a: { b: { c: 5 } } };
const branch = ['a', 'b'];
const newState = { c: 6 };
const newStateTree = modifyIn(stateTree, branch, state => assign(state, newState));
console.log(newStateTree);
// => { a: { b: { c: 6 } } }
Polyfill
import 'immu-func/polyfill';
const obj1 = { a: { b: 5 } };
const obj2 = obj1.setIn(['a', 'b'], 6);
console.log(obj2);
// => { a: { b: 6 } }
import 'immu-func/polyfill';
const obj1 = { a: { b: 5 } };
const obj2 = obj1.setIn(['a', 'b'], 6);
console.log(obj2);
// => { a: { b: 6 } }
API Reference
clone
const arr1 = [1, 2, 3]
const arr2 = clone(arr);
console.log(arr2);
// => [ 1, 2, 3 ];
console.log(arr1 === arr2);
// => false;
const obj1 = { a: 5 };
const obj2 = clone(obj1);
console.log(obj2);
// => { a: 5 }
console.log(obj1 === obj2);
// => false
update
const obj1 = { a: 5 }
const obj2 = update(obj1, 'a', a => a + 1);
console.log(obj2);
// => { a: 6 }
setIn
const obj1 = { a: { b: { c: 5 } } };
const obj2 = setIn(obj1, ['a', 'b', 'c'], 6);
console.log(obj2);
// => { a: { b: { c: 6 } } }
updateIn
const obj1 = { a: { b: { c: 5 } } };
const obj2 = modifyIn(obj1, ['a', 'b', 'c'], c => c + 1);
console.log(obj2);
// => { a: { b: { c: 6 } } }
keys
console.log(keyChain('a.2.c'));
// => [ 'a', 2, 'c' ]
assign
const obj1 = { a: 5 }
const obj2 = { b: 6 }
const obj3 = assign(obj1, obj2);
console.log(obj3);
// => { a: 5, b: 6 }
const arr1 = [0, 1, 2, 3, 4];
const arr2 = { 4: 1000 }
const arr3 = assign(arr1, arr2);
console.log(arr3);
// => [ 0, 1, 2, 3, 1000 ];
deepMerge
const obj1 = {
a: 1,
b: [0, 1, 2, { c: 5 }],
}
const obj2 = {
b: {
3: {
c: 100,
}
}
}
const obj3 = deepMerge(obj1, obj2);
console.log(obj3);
// => { a: 1, b: [ 0, 1, 2, { c: 100 } ] }
class Message { /*...*/ }
function isMessage(arg) { /*...*/ }
const obj1 = {
messages: [new Message(), new Message(), /*...*/]
}
const obj2 = {
messages: [new Message(), new Message(), /*...*/]
}
const obj3 = deepMerge(obj1, obj2, (target, source) => {
if (isMessage(target) && isMessage(source)) {
return target.merge(source);
}
})
deepEqual
const obj1 = {
a: 1,
b: [0, 1, 2, { c: 5 }],
}
const obj2 = {
a: 1,
b: [0, 1, 2, { c: 5 }],
}
console.log(deepEqual(obj1, obj2));
// => true
const obj3 = setIn(obj2, ['b', 3, 'c'], 6);
console.log(deepEqual(obj2, obj3));
// => false;
deepEqual(obj1, obj2, (target, source) => {/*...*/})
deepClone
const obj1 = {/*...*/}
const obj2 = deepClone(obj1, obj => {
if (isMessage(obj)) {
return new Message(obj);
}
})
setType
class Message {
constructor() {
this.content = "hello!";
}
getContent() {
return this.content;
}
}
let state = {
message: new Message()
}
let newState = setIn(state, ['message', 'content'], "hello world!");
newState.message = setType(newState.message, Message);
console.log(newState.message.getContent());
// => hello world!
Changelog
Visit Github Releases page for more infomation.