Minimal State Machine

A very minimalistic state machine.

by Julien Etienne

HTML

<button>ON/ off</button>
<button>ON</button>
<button>off</button>
<!-- The light Switch -->
<div id="light"></div>

CSS

#light {
  width: 100px;
  height: 100px;
  border-radius: 100px;
  background: white;
  border: 1px solid black;
}

JavaScript

var ambedo = {};
ambedo.stateStore = {};
ambedo.store = function(record) {
  function checkStateNameExist(stateName) {
    return stateName === record.name;
  }
  // check stateStore to see if new record name exist.
  var recordNameExist = !!Object.keys(ambedo.stateStore).filter(checkStateNameExist).length;
  if (recordNameExist) {
    throw new Error(record.name + ' is already in the stateStore.');
  } else {
    // Add record to the stateStore.
    ambedo.stateStore[record.name] = record.state;
  }
};

ambedo.toggle = function(stateName, toggleStateStr) {
  var shouldToggle = toggleStateStr.indexOf(':') >= 0;
  var toggleStates;
  if (shouldToggle) {
    toggleStates = toggleStateStr.split(':');
  } else {
    toggleStates = [toggleStateStr];
  }

  var recordStates = ambedo.stateStore[stateName];
  /*
    function getCurrentState(states) {
      for (var state in states) {
        if (states[state]) {
          return state;
        }
      }
    }

    var currentState = getCurrentState(recordStates);
  */
  function setState(states, newState) {
    for (var state in states) {
      if (state === newState) {
        states[state] = true;
      } else {
        states[state] = false;
      }
    }
  }

  function getState(states) {
    for (var state in states) {
      if (states[state]) {
        return state;
      }
    }
  }

  if (ambedo.toggle.prototype.state && shouldToggle) {
    setState(recordStates, toggleStates[1]);
    ambedo.toggle.prototype.state = false;
  } else {
    setState(recordStates, toggleStates[0]);
    if (shouldToggle) {
      ambedo.toggle.prototype.state = true;
    }else{
    	ambedo.toggle.prototype.state = false;
    }
  }
  return getState(recordStates);
};



//////////////////



var buttons = document.getElementsByTagName('button');
var onOff = buttons[0];
var on = buttons[1];
var off = buttons[2];
var light = document.getElementById('light');

ambedo.store({
  name: 'lights',
  state: {
    on: false,
    off: true,
   ...