README
Appolo State
simple state manager for nodejs built with typescript
Installation
npm install appolo-state --save
Usage
Store(initialState: T = {},options = {maxStates: 1})
initialState
- any object
options
:
- maxStates
- max number of history states to hold default 1
import {Store} from "appolo-store"
let store = new Store<{ counter: number }>({counter: 0}, {maxStates: 10});
setState(value: Partial<T>,options={arrayMerge:"extend"})
change the current to new state
event stateChanged
if fired on state changed
import {Store} from "appolo-store"
let store = new Store<{ counter: number }>({counter: 0});
store.setState({counter: 1});
state():T
return copy of the current state
import {Store} from "appolo-store"
let store = new Store<{ counter: number }>({counter: 0});
store.setState({counter: 1});
let state = store.state()
stateAt(index: number): T
return state copy at given index
import {Store} from "appolo-store"
let store = new Store<{ counter: number }>({counter: 0},{maxStates:10});
store.setState({counter: 1});
store.setState({counter: 2});
store.stateAt(1).counter; // 1
get prevState():T
return the previous state
get nextState():T
return the next state
goToState(index: number)
index - the state index to change to
import {Store} from "appolo-store"
let store = new Store<{ counter: number }>({counter: 0},{maxStates:10});
store.setState({counter: 1});
store.setState({counter: 2});
store.goToState(1);
store.state().counter // 1
goToPrevState()
go to previous state
goToNextState()
go to next state
Events
store extends appolo-event-dispatcher
every to time the state is changed the stateChanged
if fired
import {Store} from "appolo-store"
let store = new Store<{ counter: number }>({counter: 0});
store.on("stateChanged",(state)=>{
console.log(state.counter) // 1
})
store.setState({counter: 1});
Actions
you can use the action decorator to define custom action events the store will fire event with the action name when the action is finished
import {Store,action} from "appolo-store"
class MyStore extend Store<{ counter: number }>{
super({counter: 0})
@action()
set myCounter(value){
this.setState({counter:value})
}
@action()
async updateMyCounter(value){
await doSomeThingAsync()
this.setState({counter:value})
}
}
(async function (){
let store = new MyStore<>();
store.on("myCounter",(state)=>{
console.log(state.counter) // 1
})
store.myCounter = 1;
store.updateMyCounter(2);
let state = await store.once("updateMyCounter")
console.log(state.counter) // 2
})()
Iterator
you can loop over all the states from the beginning iterator
import {Store} from "appolo-store"
let store = new Store<{ counter: number }>({counter: 0});
store.setState({counter: 1});
store.setState({counter: 2});
for (let state of store.states()) {
console.log(state.counter) // 0 ,1 ,2
}
reset
import {Store} from "appolo-store"
let store = new Store<{ counter: number }>({counter: 0});
store.setState({counter: 1});
store.setState({counter: 2});
store.reset()
store.state().counter // 0
Tests
npm run test
License
MIT