// 2025-2026 Богданович Давид Когут Прихожденко (кдб.дійсність.укр)
взяти означення мавка/машина;
простір мавка {
дія створити_притримувач(
М: адреса<Машина>
) -> адреса<Притримувач> {
змінна притримувач = виділити<Притримувач>(М);
притримувач.попередній = М.останній_притримувач;
притримувач.наступний = пусто;
притримувач.перший = пусто;
притримувач.останній = пусто;
М.останній_притримувач.наступний = притримувач;
М.останній_притримувач = притримувач;
вернути притримувач;
}
дія знищити_притримувач(
М: адреса<Машина>,
притримувач: адреса<Притримувач>
) {
якщо М.глобальний_притримувач == притримувач {
вернути;
}
якщо притримувач.попередній != пусто {
притримувач.попередній.наступний = притримувач.наступний;
}
якщо притримувач.наступний != пусто {
притримувач.наступний.попередній = притримувач.попередній;
}
якщо М.останній_притримувач == притримувач {
М.останній_притримувач = притримувач.попередній;
}
}
дія притримати(
М: адреса<Машина>,
притримувач: адреса<Притримувач>,
предмет: адреса<Предмет>
) -> адреса<Притриманий> {
змінна притриманий = виділити<Притриманий>(М);
притриманий.попередній = притримувач.останній;
притриманий.наступний = пусто;
притриманий.предмет = предмет;
якщо притримувач.останній != пусто {
притримувач.останній.наступний = притриманий;
}
притримувач.останній = притриманий;
якщо притримувач.перший == пусто {
притримувач.перший = притриманий;
}
вернути притриманий;
}
дія відпустити_притриманий(
М: адреса<Машина>,
притримувач: адреса<Притримувач>,
притриманий: адреса<Притриманий>
) {
якщо притриманий.попередній != пусто {
притриманий.попередній.наступний = притриманий.наступний;
}
якщо притриманий.наступний != пусто {
притриманий.наступний.попередній = притриманий.попередній;
}
якщо притримувач.перший == притриманий {
притримувач.перший = притриманий.наступний;
}
якщо притримувач.останній == притриманий {
притримувач.останній = притриманий.попередній;
}
}
дія притримати_глобально(
М: адреса<Машина>,
предмет: адреса<Предмет>
) -> адреса<Притриманий> {
вернути притримати(М, М.глобальний_притримувач, предмет);
}
дія відпустити_притриманий_глобально(
М: адреса<Машина>,
притриманий: адреса<Притриманий>
) {
відпустити_притриманий(М, М.глобальний_притримувач, притриманий);
}
}