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

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

простір мавка {
  простір бібліотека {
    структура АргументНадсилання {
      М: *Машина;
      прт_значення: *Притриманий;
    }

    структура АргументЗакінчення {
      М: *Машина;
      прт_значення: *Притриманий;
    }

    внутрішня дія здійснити_предмет(М: *Машина, предмет: *Предмет, кількість_задіяних: п32, дані_задіяних: *Значення) {
      змінна інформація_падіння: ІнформаціяПадіння;

      здійснити(
        М,
        НЕДІЙСНЕ,
        ПРЕДМЕТ(предмет),
        Задіяні { ВидЗадіяних2, кількість_задіяних, дані_задіяних, 0 },
        МІСЦЕю8(М, ю8"вм://бібліотека/інет/Звʼязок.ц", 0),
      );

      якщо отримати_інформацію_падіння(М, інформація_падіння::адреса) {
        якщо М.налаштування.обробник_падінь == пусто {
          ЗАПАНІКУВАТИ(М, "необроблене падіння!");
        } інакше {
          вимкнути_стан_падіння(М);

          М.налаштування.обробник_падінь(
            М,
            інформація_падіння
          );
        }
      }
    }

    внутрішня дія відклик_надсилання(адр_звʼязок: адреса, аргумент_надсилання: адреса) {
      змінна аз = бібліотека_мавки_інет_отримати_аргумент_звʼязку(адр_звʼязок) як *АргументІнетЗвʼязку;
      змінна ан = аргумент_надсилання як *АргументНадсилання;
      змінна М = ан.М;

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

      звільнити(М, ан);
    }

    внутрішня дія відклик_закінчення(адр_звʼязок: адреса, аргумент_закінчення: адреса) {
      змінна аз = бібліотека_мавки_інет_отримати_аргумент_звʼязку(адр_звʼязок) як *АргументІнетЗвʼязку;
      змінна азк = аргумент_закінчення як *АргументНадсилання;
      змінна М = азк.М;

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

      звільнити(М, азк);
    }

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

      якщо діяльність.здійснювач.вид != ЗПредмет {
        вернути ПАДІННЯ(М, створити_текст(М, "Неможливо здійснити дію \"надіслати\"."));
      }

      змінна предмет_звʼязку = діяльність.здійснювач.дані як *Предмет як *СкладенийПредмет;

      якщо предмет_звʼязку.клас != кдбм.інет__Звʼязок {
        вернути ПАДІННЯ(М, створити_текст(М, "Неможливо здійснити дію \"надіслати\"."));
      }

      змінна задіяне_значення = НЕДІЙСНЕ;
      змінна знайдено_задіяне_значення = ні;

      знайдено_задіяне_значення = знайти_задіяне(М, діяльність.задіяні, 0, М.константи_назв._значення, задіяне_значення::адреса);

      змінна предмет_значення: *Предмет = пусто;
      змінна дані: *п8 = пусто;
      змінна розмір: природне = 0;

      якщо задіяне_значення.вид == ЗПредмет {
        предмет_значення = задіяне_значення.дані як *Предмет;

        якщо предмет_значення.клас == М.клас_Дані {
          змінна предмет_даних = предмет_значення як *ПредметДаних;

          дані = предмет_даних.дані;
          розмір = предмет_даних.розмір;
        } інакше якщо предмет_значення.клас == М.клас_Текст {
          змінна предмет_тексту = предмет_значення як *ПредметТексту;

          дані = предмет_тексту.значення.дані;
          розмір = предмет_тексту.значення.розмір;
        } інакше {
          вернути ПАДІННЯ(М, створити_текст(М, "Задіяне \"значення\" має бути даними або текстом."));
        }
      } інакше {
        вернути ПАДІННЯ(М, створити_текст(М, "Задіяне \"значення\" має бути даними або текстом."));
      }

      якщо розмір == 0 {
        вернути ДІЙСНЕ;
      }

      змінна кдз = предмет_звʼязку.користувацькі_дані.значення як *КористувацькіДаніІнетЗвʼязку;
      якщо кдз.адр_звʼязок == пусто {
        // потім: ймовірно треба тригернути обробник_помилки
        вернути НЕДІЙСНЕ;
      }

      змінна ан = виділити<АргументНадсилання>(М, 1);
      ан.М = М;
      ан.прт_значення = притримати_глобально(М, предмет_значення);

      змінна результат = бібліотека_мавки_інет_звʼязок_надіслати(
        кдз.адр_звʼязок,
        дані,
        розмір,
        ан,
        відклик_надсилання,
      );

      вернути ЛОГЛОГ(результат);
    }

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

      якщо діяльність.здійснювач.вид != ЗПредмет {
        вернути ПАДІННЯ(М, створити_текст(М, "Неможливо здійснити дію \"закінчити\"."));
      }

      змінна предмет_звʼязку = діяльність.здійснювач.дані як *Предмет як *СкладенийПредмет;

      якщо предмет_звʼязку.клас != кдбм.інет__Звʼязок {
        вернути ПАДІННЯ(М, створити_текст(М, "Неможливо здійснити дію \"закінчити\"."));
      }

      змінна задіяне_значення = НЕДІЙСНЕ;
      змінна знайдено_задіяне_значення = ні;

      знайдено_задіяне_значення = знайти_задіяне(М, діяльність.задіяні, 0, М.константи_назв._значення, задіяне_значення::адреса);

      змінна предмет_значення: *Предмет = пусто;
      змінна дані: *п8 = пусто;
      змінна розмір: природне = 0;

      якщо знайдено_задіяне_значення {
        якщо задіяне_значення.вид == ЗНедійсне {
        } інакше якщо задіяне_значення.вид == ЗПредмет {
          предмет_значення = задіяне_значення.дані як *Предмет;

          якщо предмет_значення.клас == М.клас_Дані {
            змінна предмет_даних = предмет_значення як *ПредметДаних;

            дані = предмет_даних.дані;
            розмір = предмет_даних.розмір;
          } інакше якщо предмет_значення.клас == М.клас_Текст {
            змінна предмет_тексту = предмет_значення як *ПредметТексту;

            дані = предмет_тексту.значення.дані;
            розмір = предмет_тексту.значення.розмір;
          } інакше {
            вернути ПАДІННЯ(М, створити_текст(М, "Задіяне \"значення\" має бути даними або текстом."));
          }
        } інакше {
          вернути ПАДІННЯ(М, створити_текст(М, "Задіяне \"значення\" має бути даними або текстом."));
        }
      }

      якщо розмір == 0 {
        вернути НЕДІЙСНЕ;
      }

      змінна кдз = предмет_звʼязку.користувацькі_дані.значення як *КористувацькіДаніІнетЗвʼязку;
      якщо кдз.адр_звʼязок == пусто {
        // потім: ймовірно треба тригернути обробник_помилки
        вернути НЕДІЙСНЕ;
      }

      змінна ан = виділити<АргументЗакінчення>(М, 1);
      ан.М = М;
      ан.прт_значення = притримати_глобально(М, предмет_значення);

      бібліотека_мавки_інет_звʼязок_закінчити(
        кдз.адр_звʼязок,
        дані,
        розмір,
        ан,
        відклик_надсилання,
      );

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

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

      якщо діяльність.здійснювач.вид != ЗПредмет {
        вернути ПАДІННЯ(М, створити_текст(М, "Неможливо здійснити дію \"закінчити\"."));
      }

      змінна предмет_звʼязку = діяльність.здійснювач.дані як *Предмет як *СкладенийПредмет;

      якщо предмет_звʼязку.клас != кдбм.інет__Звʼязок {
        вернути ПАДІННЯ(М, створити_текст(М, "Неможливо здійснити дію \"закінчити\"."));
      }

      змінна кдз = предмет_звʼязку.користувацькі_дані.значення як *КористувацькіДаніІнетЗвʼязку;
      якщо кдз.адр_звʼязок == пусто {
        // потім: ймовірно треба тригернути обробник_помилки
        вернути НЕДІЙСНЕ;
      }

      бібліотека_мавки_інет_звʼязок_знищити(
        кдз.адр_звʼязок
      );

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

    внутрішня дія записати_метод_класу_Звʼязок__надіслати(
      М: *Машина,
      клас: *ПредметКласу
    ) {
      змінна предмет_дії = створити_рідну_дію(
        М,
        М.константи_назв._надіслати,
        М.пуста_послідовність,
        пусто,
        рідна_дія_методу_структури_Звʼязок__надіслати,
        пусто
      );

      записати_метод_класу(
        М,
        клас,
        М.константи_назв._надіслати,
        предмет_дії
      );

      якщо М.стан_падіння {
        ЗАПАНІКУВАТИ(М, "Помилка при записі методу \"надіслати\" для класу \"Звʼязок\".");
      }
    }

    внутрішня дія записати_метод_класу_Звʼязок__закінчити(
      М: *Машина,
      клас: *ПредметКласу
    ) {
      змінна предмет_дії = створити_рідну_дію(
        М,
        М.константи_назв._закінчити,
        М.пуста_послідовність,
        пусто,
        рідна_дія_методу_структури_Звʼязок__закінчити,
        пусто
      );

      записати_метод_класу(
        М,
        клас,
        М.константи_назв._закінчити,
        предмет_дії
      );

      якщо М.стан_падіння {
        ЗАПАНІКУВАТИ(М, "Помилка при записі методу \"закінчити\" для класу \"Звʼязок\".");
      }
    }

    внутрішня дія записати_метод_класу_Звʼязок__знищити(
      М: *Машина,
      клас: *ПредметКласу
    ) {
      змінна предмет_дії = створити_рідну_дію(
        М,
        М.константи_назв._знищити,
        М.пуста_послідовність,
        пусто,
        рідна_дія_методу_структури_Звʼязок__знищити,
        пусто
      );

      записати_метод_класу(
        М,
        клас,
        М.константи_назв._знищити,
        предмет_дії
      );

      якщо М.стан_падіння {
        ЗАПАНІКУВАТИ(М, "Помилка при записі методу \"знищити\" для класу \"Звʼязок\".");
      }
    }

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

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

      записати_метод_класу_Звʼязок__надіслати(М, кдбм.інет__Звʼязок);
      записати_метод_класу_Звʼязок__закінчити(М, кдбм.інет__Звʼязок);
      записати_метод_класу_Звʼязок__знищити(М, кдбм.інет__Звʼязок);

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