Код Senior Состояние и данные обновлено

Оптимистичный лайк с откатом

Условие

Реализуйте редьюсер оптимистичных лайков. applyLikes(posts, events) получает массив постов { id, likes, liked } и события по порядку:

  • ["like", id, reqId]: оптимистично поставить лайк (если уже стоит, ничего не делать и запрос не запоминать);
  • ["ok", reqId]: сервер подтвердил запрос, ничего менять не нужно;
  • ["fail", reqId]: сервер отказал, откатить именно этот лайк (вернуть liked: false и уменьшить likes), если он ещё не откатан.

Неизвестный reqId игнорируется. Вернуть итоговый массив постов, исходный не менять.

Примеры

applyLikes([{"id":"a","likes":5,"liked":false}], [["like", "a", "r1"]]) // [{"id":"a","likes":6,"liked":true}]
applyLikes([{"id":"a","likes":5,"liked":false}], [["like", "a", "r1"], ["ok", "r1"]]) // [{"id":"a","likes":6,"liked":true}]
applyLikes([{"id":"a","likes":5,"liked":false}], [["like", "a", "r1"], ["fail", "r1"]]) // [{"id":"a","likes":5,"liked":false}]

Как подойти

Подсказки: 2
  1. Запоминайте reqId -> id поста только для реально применённых лайков.
  2. После ok или fail удаляйте запрос из ожидающих.

Решите в тренажёре

Редактор с автотестами прямо в браузере. Можно решить спокойно, вслух или под таймером, как на собесе.