1.3.0 • Published 9 years ago
associative-reducer v1.3.0
Associative Reducer
Makes a reducer associative.
Description
It turns a reducer into an associative reducer.
Suppose we have a reducer which return a state like this:{ value: 3 }
We can make it return an associative state as below.
{
'key1': { value: 1 },
'key2': { value: 2 },
'key3': { value: 3 }
}Example
import { associate, attachKey, DELETE } from 'associative-reducer'
const reducer = associate((state = 0, action) => {
const { type, payload } = action
switch (type) {
case 'INIT_TO':
return payload
case 'ADD':
return state + payload
case 'DELETE':
return DELETE
default:
return state
}
}, ['INIT', 'INIT_TO'])
let state
const dispatch = (action) => state = reducer(state, action)
const init = () => ({ type: 'INIT' })
const initTo = (value) => ({ type: 'INIT_TO', payload: value })
const add = (value) => ({ type: 'ADD', payload: value })
const del = () => ({ type: 'DELETE' })
const associatedAdd = associate(add)
// associatedAdd(key, value) is the same as attachKey(add(value), key)
dispatch(init())
expect(state).to.eql({})
dispatch(attachKey(init(), 'a'))
expect(state).to.eql({ a: 0 })
dispatch(attachKey(initTo(5), 'b'))
expect(state).to.eql({ a: 0, b: 5 })
dispatch(attachKey(add(3), 'a'))
expect(state).to.eql({ a: 3, b: 5 })
dispatch(associatedAdd('b', 1))
expect(state).to.eql({ a: 3, b: 6 })
dispatch(add(1))
expect(state).to.eql({ a: 4, b: 7 })
dispatch(attachKey(del(), 'b'))
expect(state).to.eql({ a: 4 })
dispatch(del())
expect(state).to.eql({})Installation
npm i --save associative-reducer
API
associate(reducer, newKeyAction) => wrappedReducer
reducerA source reducer
When a reducer returnsDELETE, the state for the key will be deleted.newKeyAction: string | array | (type) => boolstringA new key will be added ifaction.typeequals tonewKeyActionarrayA new key will be added ifnewKeyActioncontainsaction.type(type) => boolA new key will be added if the result ofnewKeyAction(action.type)istrue
wrappedReducerA reducer which returns associative state
associate(actionCreator) => wrappedActionCreator
acitonCreatorThe source action creatorwrappedActionCreatorThe action creator which accepts the key as its first parameter
attachKey(action, key) => newAction
actionA source actionnewActionAn action attached the key
License
MIT