joeyfigaro
6/16/2017 - 2:28 PM

Real World Ramda: Readable Redux Stores (devtools.js)

Real World Ramda: Readable Redux Stores (devtools.js)

// client/store/devtools.js

import { curry, is, ifElse, allPass, isNil, not, identity } from 'ramda';
import { compose } from 'redux';
import { Iterable } from 'immutable';

const windowExists = is(Object, window);
const extensionCompose = window.__REDUX_DEVTOOLS_EXTENSION_COMPOSE__;
const extensionComposeExists = not(isNil(extensionCompose));
const isImmutable = curry(Iterable.isIterable);
const serializeImmutable = value => value.toJS();
const defaultExtensionOptions = {
	serialize: {
		replacer: (key, value) => ifElse(
			isImmutable,
			serializeImmutable,
			identity
		)(value)
	}
};

const composeEnhancers = curry((options = defaultExtensionOptions) => {
	return ifElse(
		allPass(windowExists, extensionComposeExists),
		extensionCompose(options),
		compose
	);
});

export { composeEnhancers as default, defaultExtensionOptions };