// 2025-2026 Богданович Давид Когут Прихожденко (кдб.дійсність.укр)

взяти визначення мавка;

простір мавка {
  дія створити_притримувач(
    М: *Машина
  ) -> *Притримувач {
    змінна притримувач = виділити<Притримувач>(М, 1);

    притримувач.попередній = М.останній_притримувач;
    притримувач.наступний = пусто;
    притримувач.перший = пусто;
    притримувач.останній = пусто;

    М.останній_притримувач.наступний = притримувач;
    М.останній_притримувач = притримувач;

    вернути притримувач;
  }

  дія знищити_притримувач(
    М: *Машина,
    притримувач: *Притримувач
  ) {
    якщо М.глобальний_притримувач == притримувач {
      вернути;
    }

    якщо притримувач.попередній != пусто {
      притримувач.попередній.наступний = притримувач.наступний;
    }

    якщо притримувач.наступний != пусто {
      притримувач.наступний.попередній = притримувач.попередній;
    }

    якщо М.останній_притримувач == притримувач {
      М.останній_притримувач = притримувач.попередній;
    }
  }

  дія притримати(
    М: *Машина,
    притримувач: *Притримувач,
    предмет: *Предмет
  ) -> *Притриманий {
    змінна притриманий = виділити<Притриманий>(М, 1);

    притриманий.попередній = притримувач.останній;
    притриманий.наступний = пусто;
    притриманий.предмет = предмет;

    якщо притримувач.останній != пусто {
      притримувач.останній.наступний = притриманий;
    }
    притримувач.останній = притриманий;

    якщо притримувач.перший == пусто {
      притримувач.перший = притриманий;
    }

    вернути притриманий;
  }

  дія відпустити_притриманий(
    М: *Машина,
    притримувач: *Притримувач,
    притриманий: *Притриманий
  ) {
    якщо притриманий.попередній != пусто {
      притриманий.попередній.наступний = притриманий.наступний;
    }

    якщо притриманий.наступний != пусто {
      притриманий.наступний.попередній = притриманий.попередній;
    }

    якщо притримувач.перший == притриманий {
      притримувач.перший = притриманий.наступний;
    }

    якщо притримувач.останній == притриманий {
      притримувач.останній = притриманий.попередній;
    }
  }

  дія притримати_глобально(
    М: *Машина,
    предмет: *Предмет
  ) -> *Притриманий {
    вернути притримати(М, М.глобальний_притримувач, предмет);
  }

  дія відпустити_притриманий_глобально(
    М: *Машина,
    притриманий: *Притриманий
  ) {
    відпустити_притриманий(М, М.глобальний_притримувач, притриманий);
  }
}