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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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