Конечный автомат

283
09 марта 2017, 23:38

Набросал пример исходя из описания алгоритма. Хочу услышать замечания, что стоило бы изменить в этом коде:

// https://en.wikipedia.org/wiki/Finite-state_machine
// https://en.wikipedia.org/wiki/Event-driven_finite-state_machine
class FSM {
  constructor(transitions = []) {
    this.transitions = new Map();
    for (let {from, event, to, action} of transitions) {
      this.addTransition(from, event, to, action);
    }
    this.currentState = transitions.length ? transitions[0].from : null;
  }
  addTransition(from, event, to, action) {
    let events = this.transitions.get(from);
    if (!events) {
      events = new Map();
      this.transitions.set(from, events);
    }
    events.set(event, {to, action});
  }
  emit(event, ...args) {
    const events = this.transitions.get(this.currentState);
    if (events) {
      const obj = events.get(event);
      if (obj) {
        this.currentState = obj.to;
        obj.action.apply(this, args);
      }
    }
  }
}

const turnstile = new FSM([
  {
    from: 'locked',
    event: 'coin',
    to: 'unlocked',
    action: () => {
      console.log('Турникет разблокирован, и посетитель может пройти.');
    }
  },
  {
    from: 'locked',
    event: 'push',
    to: 'locked',
    action: () => {
      console.log('Посетитель толкает турникет, но тот заблокирован.');
    }
  },
  {
    from: 'unlocked',
    event: 'coin',
    to: 'unlocked',
    action: () => {
      console.log('Посетитель опускает еще одну монету в турникет, состояние не меняется.');
    }
  },
  {
    from: 'unlocked',
    event: 'push',
    to: 'locked',
    action: () => {
      console.log('Как только посетитель проходит, турникет блокируется.');
    }
  },
]);
turnstile.emit('push');
turnstile.emit('coin');
turnstile.emit('coin');
turnstile.emit('push');
turnstile.emit('push');

Вывод:

Посетитель толкает турникет, но тот заблокирован.
Турникет разблокирован, и посетитель может пройти.
Посетитель опускает еще одну монету в турникет, состояние не меняется.
Как только посетитель проходит, турникет блокируется.
Посетитель толкает турникет, но тот заблокирован.
READ ALSO
Сравнение скорости загрузки серверного шрифта и google-шрифта

Сравнение скорости загрузки серверного шрифта и google-шрифта

На англоязычном стаке задавал вопрос о проблемах подключения шрифта через @font-face

316
Вычитание. Длинная арифметика. JS

Вычитание. Длинная арифметика. JS

Необходимо реализовать вычитание больших чиселНаписала функцию, но в консоли выводит с ошибкой: 499999-41900

455
Проверка поля input[text]

Проверка поля input[text]

Как проверить поле input[text] ? Только вот не отправляя формуЕсть кнопка "Дальше" нажимая на эту кнопку проверяется поле

295