Набросал пример исходя из описания алгоритма. Хочу услышать замечания, что стоило бы изменить в этом коде:
// 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');
Вывод:
Посетитель толкает турникет, но тот заблокирован.
Турникет разблокирован, и посетитель может пройти.
Посетитель опускает еще одну монету в турникет, состояние не меняется.
Как только посетитель проходит, турникет блокируется.
Посетитель толкает турникет, но тот заблокирован.
Кофе для программистов: как напиток влияет на продуктивность кодеров?
Рекламные вывески: как привлечь внимание и увеличить продажи
Стратегії та тренди в SMM - Технології, що формують майбутнє сьогодні
Выделенный сервер, что это, для чего нужен и какие характеристики важны?
Современные решения для бизнеса: как облачные и виртуальные технологии меняют рынок
На англоязычном стаке задавал вопрос о проблемах подключения шрифта через @font-face
Необходимо реализовать вычитание больших чиселНаписала функцию, но в консоли выводит с ошибкой: 499999-41900
Как проверить поле input[text] ? Только вот не отправляя формуЕсть кнопка "Дальше" нажимая на эту кнопку проверяется поле