State Management for Go Backend applications inspired by Redux.
βββββββββββ ββββββββββββ βββββββββββββ βββββββββββββββββββ β Action βββββββ>β Reducer β ββββ> β Store β ββββ> β Application β βββββββββββ ββββββββββββ βββββββββββββ βββββββββββββββββββ ^ β ββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
Install
- Go:
go get github.com/luisvinicius167/godux
Data Flow
godux gives go unidirectional data flow:
- The Action returns a small map with specific directions that are dispatched to a Reducer.
- The Reducer is a pure function (pure functions don't change original arguments) if relevant to it returns a new Value.
- The Value becomes the new State of the Store.
Principles:
- Global application state is held in the Store, as a single map.
- State is ready-only (only change it only by replacing it with the Reducer).
- Changes are made with pure functions - Actions/Reducers that do not change the actual object but make a changed copy.
Store:
A Store is basically a container that holds your application state.
store := godux.NewStore()
store.Setstate("count", 1)
store.Setstate("Title", "I like godux!")
Action
Actions are just pure functions which pass on their inputs when they're dispatched. Actions are stored on the godux
map as godux.Action
.
increment := func(number int) godux.Action {
return godux.Action{
Type: "INCREMENT",
Value: number,
}
}
Reducers
As in Redux:
"Actions describe the fact that something happened, but donβt specify how the applicationβs state changes in response. This is the job of a reducer".
Reducers are pure functions that take in actions and the state of the store as inputs and leave them all as they came in (aka. pure)-- especially the original state of the store must not be modified (it's accessed by store.GetState
)).
// reducer function
reducer := func(action godux.Action) interface{} {
switch action.Type {
case "INCREMENT":
return store.GetState("count").(int) + action.Value.(int)
case "DECREMENT":
return action.Value.(int) - store.GetState("count").(int)
default:
return store.GetAllState()
}
}
// Add your reducer function to return new values basend on your state
store.Reducer(reducer)
Dispatch
Dispatching an action is very easy.
// Receive new value
newCount := store.Dispatch(increment(1)) // return 2
API Reference
-
Store:
godux.newStore()
: Create a single store with the state of your application (should only be used once).godux.SetState(name string, value interface{})
: Sets the state of the store.godux.GetState(name string)
: Return a state's value.godux.GetAllState()
: Return the whole state as a map.
-
Reducer:
store.Reducer(func(action godux.Action))
: Adding a reducer function to your Store.
-
Dispatch:
store.Dispatch(action godux.Action)
: Dispatching an action to your Reducer.
-
Action:
godux.Action( Type string, Value interface{})
: Adding an easily available Action.
License
MIT License.