0.1.0 • Published 7 years ago

immu-func v0.1.0

Weekly downloads
1
License
MIT
Repository
github
Last release
7 years ago

ImmuFunc

Effective functions to keep data structure immutable

Build Status

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.

0.1.0

7 years ago

0.0.3-0

7 years ago

0.0.2-4

7 years ago

0.0.2-3

7 years ago

0.0.2-2

7 years ago

0.0.2-1

7 years ago

0.0.2-0

7 years ago

0.0.1

7 years ago