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

взяти визначення мавка/бібліотека;
взяти визначення мавка/пристрій;

простір мавка {
  простір бібліотека {
    внутрішня дія машина_взяти_біб(
      М: *Машина,
      довжина_шляху: природне,
      шлях: **ПредметТексту,
      місцезнаходження: Місцезнаходження
    ) -> ЗначенняАбоСтанПадіння {
      змінна кдбм = М.користувацькі_дані_бібліотеки.значення як *КористувацькіДаніБібліотекиМавки;

      якщо довжина_шляху == 1 {
        якщо порівняти_тексти(М, шлях[0], М.константи_назв._мат) {
          якщо кдбм.взято__мат == пусто {
            змінна предмет_модуля_мат = створити_модуль(
              М,
              М.константи_назв._мат
            );

            кдбм.взято__мат = притримати_глобально(
              М,
              предмет_модуля_мат як *Предмет
            );

            ініціалізувати__мат(М, предмет_модуля_мат);

            якщо М.стан_падіння {
              відпустити_притриманий_глобально(М, кдбм.взято__мат);
              кдбм.взято__мат = пусто;

              вернути НЕДІЙСНЕ;
            }
          }

          вернути ПРЕДМЕТ(кдбм.взято__мат.предмет);
        }

        якщо порівняти_тексти(М, шлях[0], М.константи_назв._афс) {
          якщо кдбм.взято__афс == пусто {
            змінна предмет_модуля_афс = створити_модуль(
              М,
              М.константи_назв._афс
            );

            кдбм.взято__афс = притримати_глобально(
              М,
              предмет_модуля_афс як *Предмет
            );

            ініціалізувати__афс(М, предмет_модуля_афс);

            якщо М.стан_падіння {
              відпустити_притриманий_глобально(М, кдбм.взято__афс);
              кдбм.взято__афс = пусто;

              вернути НЕДІЙСНЕ;
            }
          }

          вернути ПРЕДМЕТ(кдбм.взято__афс.предмет);
        }

        якщо порівняти_тексти(М, шлях[0], М.константи_назв._аввід) {
          якщо кдбм.взято__аввід == пусто {
            змінна предмет_модуля_аввід = створити_модуль(
              М,
              М.константи_назв._аввід
            );

            кдбм.взято__аввід = притримати_глобально(
              М,
              предмет_модуля_аввід як *Предмет
            );

            ініціалізувати__аввід(М, предмет_модуля_аввід);

            якщо М.стан_падіння {
              відпустити_притриманий_глобально(М, кдбм.взято__аввід);
              кдбм.взято__аввід = пусто;

              вернути НЕДІЙСНЕ;
            }
          }

          вернути ПРЕДМЕТ(кдбм.взято__аввід.предмет);
        }

        якщо порівняти_тексти(М, шлях[0], М.константи_назв._інет) {
          якщо кдбм.взято__інет == пусто {
            змінна предмет_модуля_інет = створити_модуль(
              М,
              М.константи_назв._інет
            );

            кдбм.взято__інет = притримати_глобально(
              М,
              предмет_модуля_інет як *Предмет
            );

            ініціалізувати__інет(М, предмет_модуля_інет);

            якщо М.стан_падіння {
              відпустити_притриманий_глобально(М, кдбм.взято__інет);
              кдбм.взято__інет = пусто;

              вернути НЕДІЙСНЕ;
            }
          }

          вернути ПРЕДМЕТ(кдбм.взято__інет.предмет);
        }

        увімкнути_стан_падіння(
          М,
          ПРЕДМЕТ(створити_текст(М, "Неможливо взяти модуль бібліотеки.")),
          місцезнаходження
        );
      }

      вернути НЕДІЙСНЕ;
    }

    внутрішня дія дія_перед_знищенням_користувацьких_даних_бібліотеки_мавки(
      М: *Машина,
      користувацькі_дані: *КористувацькіДані
    ) {
      змінна кдбм = користувацькі_дані.значення як *КористувацькіДаніБібліотекиМавки;

      // потім: відпустити взяті і звільнити кдбм
    }

    дія ініціалізувати(М: *Машина) {
      М.налаштування.взяти_біб = машина_взяти_біб;

      змінна кдбм = виділити<КористувацькіДаніБібліотекиМавки>(М, 1);
      кдбм.взято__мат = пусто;
      кдбм.взято__афс = пусто;
      кдбм.взято__аввід = пусто;
      кдбм.взято__інет = пусто;

      М.користувацькі_дані_бібліотеки = створити_користувацькі_дані(
        М,
        кдбм,
        дія_перед_знищенням_користувацьких_даних_бібліотеки_мавки
      );
    }
  }
}