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

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

    внутрішня дія обробник_прочитання_ю8(дані: *п8, розмір: природне, кінець_файлу: природне, аргумент: адреса) {
      змінна аю8 = аргумент як *АргументПрочитаногоЮ8;
      змінна М = аю8.М;
      змінна предмет_відклика = аю8.відклик.предмет;

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

      змінна інформація_падіння: ІнформаціяПадіння;

      змінна кількість_задіяних = п32(0);
      змінна дані_задіяних: *Значення = пусто;

      якщо не кінець_файлу {
        змінна успіх = ні;
        змінна позиція_помилки = природне(0);
        змінна значення_кд = кд { пусто, 0 };

        успіх = перекодувати_ю8_в_кд(
          М,
          ю8 { дані, розмір },
          значення_кд::адреса,
          позиція_помилки::адреса
        );

        кількість_задіяних = п32(1);
        дані_задіяних = виділити<Значення>(М, природне(кількість_задіяних));

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

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

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

    внутрішня дія рідна_дія__запитати(
      М: *Машина,
      діяльність: *Діяльність
    ) -> ЗначенняАбоСтанПадіння {
      змінна задіяне_повідомлення = НЕДІЙСНЕ;
      змінна знайдено_задіяне_повідомлення = ні;
      змінна задіяне_відклик = НЕДІЙСНЕ;
      змінна знайдено_задіяне_відклик = ні;

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

      змінна успіх = ні;
      змінна позиція_помилки = природне(0);
      змінна повідомлення_кд = "";
      змінна повідомлення_ю8 = ю8 { пусто, 0 };

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

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

        повідомлення_кд = (предмет_повідомлення як *ПредметТексту).значення;
      }

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

      змінна предмет_відклика = задіяне_відклик.дані як *Предмет;

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

      успіх = перекодувати_кд_в_ю8(
        М,
        повідомлення_кд,
        повідомлення_ю8::адреса,
        позиція_помилки::адреса
      );
      якщо не успіх {
        вернути ПАДІННЯ(М, створити_текст(М, "Не вдалось перекодувати повідомлення в ю8."));
      }

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

      пристрій_мавки_читати_ю8_асинхронно(
        повідомлення_ю8.дані,
        повідомлення_ю8.розмір,
        обробник_прочитання_ю8,
        аргумент_ю8,
        природне(ні)
      );

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

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

      дані_параметрів[0] = ПРЕДМЕТ(створити_параметр(
        М,
        М.константи_назв._повідомлення,
        пусто,
        НЕДІЙСНЕ
      ));
      дані_параметрів[1] = ПРЕДМЕТ(створити_параметр(
        М,
        М.константи_назв._відклик,
        пусто,
        НЕДІЙСНЕ
      ));

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

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