Спать с трубами в Haste и Haskell
Я работаю над программой на Haskell, которая интенсивно использует библиотеку Pipes. Я портирую часть библиотеки на Ускорение. Единственное место, где я столкнулся с камнем преткновения, - это странный способ, которым javascript справляется со сном.
Я хотел написать простой канал, который задерживает перед отправкой результатов.
sleeper :: Int -> Pipe a a IO ()
sleeper time = forever $ do
temp <- await
sleep time
yield temp
Тем не менее, кажется, что сон работает как обратный вызов.
setTimeout :: MonadIO m => Int -> IO () -> m ()
Я пытался делать
sleeper time = do
temp <- await
yield temp
setTimeout time $ sleeper time
Но типы не выстраиваются должным образом. Есть ли способ получить задерживающую трубу?
1 ответ
Вы можете посмотреть на https://github.com/imalsogreg/pipes-rt/blob/master/lib/Pipes/RealTime.hs#L127 Там есть функция pauseUntil.