Как использовать setTimeout в PureScript v0.7

Я хочу использовать setTimeout для анимации в PureScript, как это.

loop n =
  if n > 100
  then do
    return Unit
  else do
    print n
    timeout (loop n+1) 30

Purescript-таймеры больше не работают в v0.7.

У меня нет ни малейшего представления, как это реализовать.

2 ответа

Решение

Есть два способа:

  1. Используйте purescript-js-timers из purescript-contrib.

  2. Используйте purescript-aff (later').

Я предпочитаю позже, и вот пример:

import Control.Monad.Aff as Aff

update :: forall eff. Action -> State -> EffModel State Action (eff)
update MyAction myState = 
  { state: myState, effects: [ Aff.later' 1000 $ pure MyOtherAction ] }

Самый простой способ - определить собственный импорт для setTimeout:

module SetTimeout where

foreign import data TIMEOUT :: !

foreign import timeout :: forall eff a. 
                               Int -> 
                               Eff (timeout :: TIMEOUT | eff) a -> 
                               Eff (timeout :: TIMEOUT | eff) Unit

В вашем внешнем модуле Javascript вы можете определить setTimeout следующее:

"use strict";

// module SetTimeout

exports.timeout = function(millis) {
    return function(action) {
        return function() {
            setTimeout(action, millis);
        };
    };
};

Вы сможете расширить это для работы с такими вещами, как clearTimeout если нужно.

Некоторые другие возможные подходы:

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