// 2026 Богданович Давид Когут Прихожденко

взяти визначення мавка;

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

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

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

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

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

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

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

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

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

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

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

    змінна успіх = ні;
    змінна позиція_помилки = природне(0);
    змінна предмет_повідомлення: *ПредметТексту = пусто;

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

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

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

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

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

    змінна ап = мавка::виділити<АргументПрочитаного>(М, 1);
    ап.М = М;
    якщо предмет_повідомлення == пусто {
      ап.повідомлення = пусто;
    } інакше {
      ап.повідомлення = притримати_глобально(М, предмет_повідомлення як *Предмет);
    }
    ап.відклик = притримати_глобально(М, предмет_відклика);

    читати_ввід_асинхронно(
      М,
      предмет_повідомлення,
      обробник_прочитання,
      ап,
      ні,
    );

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

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

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

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

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