Awesome
purescript-redux-saga
Redux-saga inspired library for dealing with I/O in Purescript apps. The idea is to completely isolate all I/O from pure code, meaning that neither the reducer, nor the components, nor the action creators do any kind of I/O leaving the application mostly pure and placing all I/O into a single location.
To do so, purescript-redux-saga creates a virtual thread of execution whose inputs are either actions produced by the UI or attached Sagas, or values received through "channels".
API Docs
API documentation is published on Pursuit.
Usage Example
-- Types.purs
type GlobalState = {}
data Action
= LoginRequest { username :: String, password :: String }
| LoginFailure Error
| LoginSuccess { username :: String, token :: String }
-- Sagas.purs - Perform *all* I/O your app does here
saga :: ∀ env. Saga env Action GlobalState Unit
saga = forever do
take case _ of
LoginRequest { username, password } -> Just do
liftAff (attempt $ authenticate username password) >>= case _ of
Left err -> put $ LoginFailure err
Right token -> put $ LoginSuccess { username, token }
_ -> Nothing
-- Store.purs - Install the Saga middleware
mkStore
:: ∀ eff
. Eff (ReduxEffect _)
(ReduxStore _ GlobalState Action)
mkStore = Redux.createStore reducer initialState middlewareEnhancer
where
initialState = {}
middlewareEnhancer = Redux.applyMiddleware
[ loggerMiddleware
, sagaMiddleware saga
]
-- Main.purs - Tie the bow
main :: ∀ e. Eff _ Unit
main = do
store <- mkStore
Redux.createProviderElement store [ Redux.createElement_ appClass [] ]
For a fully worked example, have a look at purescript-redux-saga-example.