Спать с трубами в 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.

Другие вопросы по тегам