luisvinicius167 / Godux
Projects that are alternatives of or similar to Godux
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
-
-
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.
-
-
-
store.Reducer(func(action godux.Action))
: Adding a reducer function to your Store.
-
-
-
store.Dispatch(action godux.Action)
: Dispatching an action to your Reducer.
-
-
-
godux.Action( Type string, Value interface{})
: Adding an easily available Action.
-
License
MIT License.