metaclass: (Default)
iterParseDeviceMsg :: Monad m => Enumeratee ByteString DeviceMsg m b
iterParseDeviceMsg = sequence $ iterParser $ parseDeviceMsg

читает последовательность строк из источника, выдает на выходе последовательность DeviceMsg.
sequence взят из Data.Enumerator, где написано:
-- | Feeds outer input elements into the provided iteratee until it yields
-- an inner input, passes that to the inner iteratee, and then loops.
sequence :: Monad m => Iteratee ao m ai
         -> Enumeratee ao ai m b

Что характерно, я не очень понимаю, что я делаю, кроме того, что превратил Iteratee(сток для данных) в Enumeratee(фильтр-конвертор для потока данных).
В итоге использование выглядит таким образом:
processWeather1:: MonadIO m => SerialPort -> m ()
processWeather1 serial = do
     E.run_ $ enumSerial serial E.$= iterParseDeviceMsg E.$$ printObjI   


Идея примерно в следующем: данные читаются из потока небольшими кусками и скармливаются парсеру, который выдает на выходе последовательность уже разобранных данных. И предположительно, это все должно работать в постоянной памяти.
Можно было бы сделать вообще влоб, но с Iteratees более мозгозасушивающе, заодно можно копипастить идеи из http://www.yesodweb.com

Сейчас вот еще к этой хрени нужно прикрутить rrdtool для складывания считанных значений в него и какой-нибудь сервис попроще, чтобы отдавать текущие показания датчиков.
metaclass: (Default)
В Iteratees обратная связь от iteratee к enumerator реализована хитрым образом - через исключения. Т.е. кидается исключение с данными, которые нужно обработать в источнике данных, например, указатель для рандомного seek в файле, оно перехватывается енумератором-источником данных и обрабатывается.

Мне видимо, придется посылать команды ком-порту в том же стиле, но вообще надо еще посушить мозги над структурой типов используемых в Iteratees, чтобы понять, почему сделано именно так, а не иначе.
Ну и посмотреть, как пакет enumerator используется в Yesod, на предмет того же - как они читают из сокета и пишут в него ответ.

Profile

metaclass: (Default)
metaclass

April 2017

S M T W T F S
      1
2345678
9101112 131415
16171819202122
23242526272829
30      

Syndicate

RSS Atom

Most Popular Tags

Style Credit

Expand Cut Tags

No cut tags
Page generated Sep. 24th, 2017 05:25 pm
Powered by Dreamwidth Studios