Симуляция дерева context: отмена и дедлайны
Условие
Смоделируйте пакет context. Узел 0 это context.Background(), он никогда не отменяется. Время начинается с 0. Операции:
new id parent cancel:WithCancel(parent);new id parent timeout T:WithTimeout(parent, T), дедлайн в моментсейчас + T;new id parent value:WithValue(parent, ...): своей отмены нет, состояние как у родителя;cancel id: вызвать cancel у контекста (только для cancel и timeout);tick t: время становится равнымt(не убывает), срабатывают все дедлайны ≤ t;check id: вывестиactive,canceledилиdeadline exceeded(то, что вернул быErr()).
Правила как в Go: отмена распространяется на всех потомков, и потомок получает ту же ошибку, что и предок, если отменён из-за него; повторная отмена ничего не меняет; контекст, созданный от уже отменённого родителя, сразу отменён с ошибкой родителя; WithTimeout с дедлайном, который уже наступил (T = 0), сразу даёт deadline exceeded. Срабатывающие на одном tick дедлайны обрабатываются по возрастанию времени дедлайна, при равенстве по возрастанию id.
Ввод: n (1 ≤ n ≤ 2000), затем операции.
Пример
9
new 1 0 cancel
new 2 1 timeout 100
new 3 2 value
check 3
tick 100
check 3
cancel 1
check 2
check 1
active
deadline exceeded
deadline exceeded
canceled
Как подойти
Дерево узлов с ошибкой; отмена обходит поддерево; на tick сортировка сработавших дедлайнов.
Решите в тренажёре
Редактор с автотестами прямо в браузере. Можно решить спокойно, вслух или под таймером, как на собесе.