Advertisement
Guest User

Untitled

a guest
Nov 2nd, 2017
260
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. {-# LANGUAGE OverloadedStrings #-}
  2. import Reflex.Dom
  3. import Data.Text
  4. import Data.Time.Clock
  5. import Data.Monoid ((<>))
  6. import Control.Monad.Fix
  7. import Control.Monad.Trans
  8.  
  9. timerWidget :: MonadWidget t m => Integer -> m ()
  10. timerWidget maxTime = do
  11.   t0 <- liftIO getCurrentTime
  12.   eStart <- button "Start"
  13.   ePause <- button "Pause"
  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.  let eSwitch = switch beStartStop
  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
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement