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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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