keypad-fsm
Version:
Finite State Machine for a Keypad
132 lines (118 loc) • 2.89 kB
JavaScript
import { COMMAND_RENDER } from 'kingly';
function _defineProperty(obj, key, value) {
if (key in obj) {
Object.defineProperty(obj, key, {
value: value,
enumerable: true,
configurable: true,
writable: true
});
} else {
obj[key] = value;
}
return obj;
}
var _states;
// State monikers
var INIT = "OFF";
var PIN = "PIN";
var NO_PIN = "NO_PIN";
var DONE = "DONE"; // Event monikers
var START = "START";
var CLEAR_CLICKED = "CLEAR_CLICKED";
var SUBMIT_CLICKED = "SUBMIT_CLICKED";
var NUM_KEY_CLICKED = "NUM_KEY_CLICKED"; // Commands
var SUBMIT = "SUBMIT";
var commands = [COMMAND_RENDER, SUBMIT]; // State update
// Basically {a, b: {c, d}}, [{b:{e}]} -> {a, b:{e}}
// All Object.assign caveats apply
// https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Object/assign
function updateState(extendedState, extendedStateUpdates) {
var extendedStateCopy = Object.assign({}, extendedState);
return extendedStateUpdates.reduce(function (acc, x) {
return Object.assign(acc, x);
}, extendedStateCopy);
}
var events = [NUM_KEY_CLICKED, SUBMIT_CLICKED, CLEAR_CLICKED, START];
var states = (_states = {}, _defineProperty(_states, INIT, ""), _defineProperty(_states, PIN, ""), _defineProperty(_states, NO_PIN, ""), _defineProperty(_states, DONE, ""), _states);
var initialControlState = INIT;
var initialExtendedState = {
pin: ""
};
var transitions = [{
from: INIT,
event: START,
to: NO_PIN,
action: displayAndEmitNoPin
}, {
from: NO_PIN,
event: NUM_KEY_CLICKED,
to: PIN,
action: displayAndEmitPin
}, {
from: PIN,
event: CLEAR_CLICKED,
to: NO_PIN,
action: displayAndEmitNoPin
}, {
from: PIN,
event: NUM_KEY_CLICKED,
to: PIN,
action: displayAndEmitPin
}, {
from: PIN,
event: SUBMIT_CLICKED,
to: DONE,
action: displayAndSubmitPin
}]; // Actions
function displayAndEmitNoPin(extendedState, eventData, settings) {
return {
updates: [{
pin: ""
}],
outputs: [{
command: COMMAND_RENDER,
params: {
pin: ""
}
}]
};
}
function displayAndEmitPin(extendedState, eventData, settings) {
var pin = extendedState.pin;
var digit = eventData;
var newPin = pin + digit;
return {
updates: [{
pin: newPin
}],
outputs: [{
command: COMMAND_RENDER,
params: {
pin: newPin
}
}]
};
}
function displayAndSubmitPin(extendedState, eventData, settings) {
var pin = extendedState.pin;
return {
updates: [],
outputs: [{
command: SUBMIT,
params: {
pin: pin
}
}]
};
}
var fsmDef = {
initialControlState: initialControlState,
initialExtendedState: initialExtendedState,
states: states,
events: events,
transitions: transitions,
updateState: updateState
};
export { commands, events, fsmDef };
//# sourceMappingURL=keypad-fsm.es.js.map