Combine Redux action handlers into a type-safe reducer.
bower install purescript-aspen
First write some action handlers. An action handler is a function that handles
one and only one Redux action. An
Action is of type
Action (t :: Symbol) p
t is the
type of the action and
p is the type of the payload. You
can write as many of these as you want. In this example I have 3.
addTask :: State -> Action "ADD_TASK" Task -> State addTask = ... toggleCompleteness :: State -> Action "TOGGLE_COMPLETENESS" Id -> State toggleCompleteness = ... removeTask :: State -> Action "REMOVE_TASK" Id -> State removeTask = ...
After we have all of the action handlers, we need to combine them into a reducer
>>=>>. This creates a reducer with the
type of all of the supported actions in the signature. This provides compile
time safety. All unsupported actions types will not change the state.
reducer :: forall p t r1 r2 . RowCons t (Action t p) r1 ( "REMOVE_TASK" :: Action "REMOVE_TASK" Id , "TOGGLE_COMPLETENESS" :: Action "ADD_TASK" Id , "ADD_TASK" :: Action "ADD_TASK" Task | r2) => IsSymbol t => State -> Action t p -> State reducer = createReducer $ handle addTask >>=>> toggleCompleteness >>=>> removeTask
To see a more detailed tutorial checkout the aspen test.
Writing reducers in Purescript is annoying, if done naïvely. All the type
action.type is annoying. However, we are guaranteed to be immutable and
have zero side-effects! These are the two reducer "rules" that are not enforced
With aspen, you can have a great life.
Aspen allows you to combine action handlers into a single Redux reducer. Each handled action is reflected in the type of the reducer making it easy to see what each reducer handles at-a-glance. Since the Actions are typed, you cannot have the wrong payload. Doing so, would result in a compile time error! Actions unknown to a reducer are passed through and ignored.
This library is like redux-actions, but PureScript-ian. Thank you for the inspiration.
- Module documentation is published on Pursuit.