Iteratees c обратной связью
Oct. 20th, 2011 01:28 pm![[personal profile]](https://www.dreamwidth.org/img/silk/identity/user.png)
В Iteratees обратная связь от iteratee к enumerator реализована хитрым образом - через исключения. Т.е. кидается исключение с данными, которые нужно обработать в источнике данных, например, указатель для рандомного seek в файле, оно перехватывается енумератором-источником данных и обрабатывается.
Мне видимо, придется посылать команды ком-порту в том же стиле, но вообще надо еще посушить мозги над структурой типов используемых в Iteratees, чтобы понять, почему сделано именно так, а не иначе.
Ну и посмотреть, как пакет enumerator используется в Yesod, на предмет того же - как они читают из сокета и пишут в него ответ.
Мне видимо, придется посылать команды ком-порту в том же стиле, но вообще надо еще посушить мозги над структурой типов используемых в Iteratees, чтобы понять, почему сделано именно так, а не иначе.
Ну и посмотреть, как пакет enumerator используется в Yesod, на предмет того же - как они читают из сокета и пишут в него ответ.
no subject
Date: 2011-10-20 11:21 am (UTC)Но кто заставляет использовать именно такую схему?
Я на ocaml+lwt+iteratees вполне пользуюсь тем, что iteratees у меня построены поверх манатки, в том числе io-подобной, и спокойно шлю данные через io-функции, выполняя их lift в манатку итератов.
Для других же целей (там, где restful) -- на каждый запрос запускаю по итерату, они возвращают ответ, который я отправляю в нужный output_channel (неизвестный, на всякий случай, обрабатывающему итерату).
Для более-менее общего расклада я бы предложил что-то типа итерата, хранящего внутри текущее состояние и, когда будет готов его ответ, возвращающего как сам ответ, так и итерат, который должен быть запущен в этой же "сессии общения" в качестве обработчика следующей команды. Цимес итератов соблюдён -- никаких явных манипуляций и вообще выдачи наружу промежуточных состояний.
no subject
Date: 2011-10-21 07:48 am (UTC)