states

0.0.2 • Public • Published

Description

Add simple state machine to Javascript objects.

Installation

npm install states

Usage

// require
states = require('states') 
 
obj = {
  name: 'duh',
  job: 'duh'
}
 
// initialize
states(obj, ["starting", "working", "not doing a damn thing", "finished"]) 
 
// returns current state (initially the first element of the array passed above)
obj.state() // "starting"
 
// defines helpers for checking current state
obj.isStarting()          // true
obj.isWorking()           // false
obj.isNotDoingADamnThing  // false
obj.isFinished()          // false
 
// can attach (optional) state event handlers directly
obj.onExitState('starting', function() {
  console.log('bye')
});
 
// or indirectly based on naming convention (onEnter{CamelizedStateName}, onExit{CamelizedStateName})
obj.onEnterNotDoingADamnThing = function() {
  console.log('OH NO')
};
 
// sets current state, calls callbacks if they're defined on obj
obj.state('not doing a damn thing')
 
// returns list of possible states
obj.states() // [ 'starting', 'working', 'not doing a damn thing', 'finished' ]

results in

'bye'
'OH NO' 

Examples

Quick example in JavaScript

states = require('states')
 
function Simple() {
  states(this, ['starting', 'done']);
  
  this.onExitState('starting', function() {
    console.log('exiting starting state');
  });
}
 
Simple.prototype.test = function() {
  if (this.isStarting()) {
    console.log('it starts in the first state by default.');
  }
  
  this.state('done')
  
  if (this.isDone()) {
    console.log('all done');
  }
}
 
Simple.prototype.onEnterDone = function() {
  console.log('entering done state');
};
 
simple = new Simple();
simple.test();

outputs

it starts in the first state by default.
exiting starting state
entering done state
all done

Longer example in CoffeeScript

states = require('states')
 
class Barfer
  constructor: ()->
    states(this[
      'TOTALLY NOT GONNA BARF'
      'OH NO'
      'GONNA BARF'
      'BARFING'
      'FEELING WAY BETTER'
    ])
 
  goTimeGottaMakeItHappenOhhhhhYeaaaaahDuffman: ()->
    console.log(this.state())
    console.log("yeah, i swear, i'm #{if this.isBarfing() then '' else ' not'} barfing")
 
    this.state('OH NO')
 
    this.state('GONNA BARF')
    if this.isGonnaBarf()
      console.log("i'm not feeling so good")
 
    this.state('BARFING')
 
    this.state('FEELING WAY BETTER')
    console.log("i am #{this.state()}")
 
  onEnterOhNo: ()->
    console.log('oooooooh nooooooooo')
 
  onExitGonnaBarf: ()->
    console.log('here goes')
 
  onEnterBarfing: ()->
    console.log('eeuauaughhhuauaahheeuauaughhhuauaahheeuauaughhhuauaahheeuauaughhhuauaahheeuauaughhhuauaahheeuauaughhhuauaahheeuauaughhhuauaahheeuauaughhhuauaahheeuauaughhhuauaahheeuauaughhhuauaahheeuauaughhhuauaahheeuauaughhhuauaahheeuauaughhhuauaahheeuauaughhhuauaahheeuauaughhhuauaahheeuauaughhhuauaahheeuauaughhhuauaahheeuauaughhhuauaahheeuauaughhhuauaahheeuauaughhhuauaahheeuauaughhhuauaahheeuauaughhhuauaahheeuauaughhhuauaahheeuauaughhhuauaahheeuauaughhhuauaahheeuauaughhhuauaahheeuauaughhhuauaahheeuauaughhhuauaahheeuauaughhhuauaahheeuauaughhhuauaahh')
 
  onEnterFeelingWayBetter: ()->
    console.log(' - http://eeuauaughhhuauaahh.ytmnd.com')
 
barfer = new Barfer()
barfer.goTimeGottaMakeItHappenOhhhhhYeaaaaahDuffman()

outputs

TOTALLY NOT GONNA BARF
yeah, i swear, i'm  not barfing
oooooooh nooooooooo
i'm not feeling so good
here goes
eeuauaughhhuauaahheeuauaughhhuauaahheeuauaughhhuauaahheeuauaughhhuauaahheeuauaughhhuauaahheeuauaughhhuauaahheeuauaughhhuauaahheeuauaughhhuauaahheeuauaughhhuauaahheeuauaughhhuauaahheeuauaughhhuauaahheeuauaughhhuauaahheeuauaughhhuauaahheeuauaughhhuauaahheeuauaughhhuauaahheeuauaughhhuauaahheeuauaughhhuauaahheeuauaughhhuauaahheeuauaughhhuauaahheeuauaughhhuauaahheeuauaughhhuauaahheeuauaughhhuauaahheeuauaughhhuauaahheeuauaughhhuauaahheeuauaughhhuauaahheeuauaughhhuauaahheeuauaughhhuauaahheeuauaughhhuauaahheeuauaughhhuauaahheeuauaughhhuauaahh
 - http://eeuauaughhhuauaahh.ytmnd.com
i am FEELING WAY BETTER

Specs

cake spec

Readme

Keywords

none

Package Sidebar

Install

npm i states

Weekly Downloads

20

Version

0.0.2

License

none

Last publish

Collaborators

  • stephenhandley