View difference between Paste ID: Jkuw84SY and yGx0TgHH
SHOW: | | - or go back to the newest paste.
1-
timerWidget :: Integer -> Widget a ()
1+
{-# LANGUAGE OverloadedStrings #-}
2
import Reflex.Dom
3-
  t0 <- liftJS getCurrentTime
3+
import Data.Text
4
import Data.Time.Clock
5
import Data.Monoid ((<>))
6-
  eTick <- tickLossyFrom (realToFrac (1 :: Integer)) t0 eStart
6+
import Control.Monad.Fix
7-
  let dTimer' = timer' t0 120 eStart ePause eTick
7+
import Control.Monad.Trans
8
9
timerWidget :: MonadWidget t m => Integer -> m ()
10-
timer' :: (PerformEvent t m, MonadWidget t m, MonadFix m, MonadHold t m, Reflex t) =>
10+
11
  t0 <- liftIO getCurrentTime
12
  eStart <- button "Start"
13-
  beStartStop <- hold never . leftmost $ [ (const 0 <$ eTick) <$ ePause, ((1+) <$ eTick) <$ eStart ]
13+
14
  eTick <- tickLossy 1.0 t0 
15
  let dTimer' = timer' t0 maxTime eStart ePause eTick
16
  dynText =<< dTimer'
17
18
timer' :: MonadWidget t m =>
19
  UTCTime -> Integer -> Event t () -> Event t () -> Event t TickInfo -> m (Dynamic t Text)
20
timer' t maxTime eStart ePause eTick = do
21
  beStartStop <- hold never . leftmost $ [ ((0+) <$ eTick) <$ ePause, ((1+) <$ eTick) <$ eStart ]
22-
        fill n = if n `elem` [0..9] then "0" <> show n else show n
22+
23
  fmap (formatS maxTime) <$> foldDyn ($) 0 eSwitch
24
25
formatS :: Integer -> Integer -> Text
26
formatS max cur =
27
  case properFraction (fromInteger (max-cur) / 60) of
28
    (mins, s) ->  let secs = round (s * 60) in
29
      pack $ fill mins <> ":" <> fill secs where
30
        fill n = if n `elem` [0..9] then "0" <> show n else show n
31
32
main = mainWidget $ timerWidget 120