• Stars
    star
    256
  • Rank 154,103 (Top 4 %)
  • Language
    Go
  • License
    MIT License
  • Created almost 8 years ago
  • Updated over 3 years ago

Reviews

There are no reviews yet. Be the first to send feedback to the community and the maintainers!

Repository Details

State Management for Go Backend application inspired in Redux.

godux

Join the chat at https://gitter.im/luisvinicius167/godux Go Report Card

State Management for Go Backend applications inspired by Redux.

Godux

โ•”โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•—       โ•”โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•—       โ•”โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•—       โ•”โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•—
โ•‘ 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.