UNPKG

keypad-fsm

Version:

Finite State Machine for a Keypad

132 lines (118 loc) 2.89 kB
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