Guest User

Untitled

a guest
Nov 2nd, 2017
248
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. timerWidget :: Integer -> Widget a ()
  2. timerWidget maxTime = do
  3.   t0 <- liftJS getCurrentTime
  4.   eStart <- button "Start"
  5.   ePause <- button "Pause"
  6.   eTick <- tickLossyFrom (realToFrac (1 :: Integer)) t0 eStart
  7.   let dTimer' = timer' t0 120 eStart ePause eTick
  8.   dynText =<< dTimer'
  9.  
  10. timer' :: (PerformEvent t m, MonadWidget t m, MonadFix m, MonadHold t m, Reflex t) =>
  11.   UTCTime -> Integer -> Event t () -> Event t () -> Event t TickInfo -> m (Dynamic t Text)
  12. timer' t maxTime eStart ePause eTick = do
  13.  beStartStop <- hold never . leftmost $ [ (const 0 <$ eTick) <$ ePause, ((1+) <$ eTick) <$ eStart ]
  14.  let eSwitch = switch beStartStop
  15.  fmap (formatS maxTime) <$> foldDyn ($) 0 eSwitch
  16.  
  17. formatS :: Integer -> Integer -> Text
  18. formatS max cur =
  19.  case properFraction (fromInteger (max-cur) / 60) of
  20.    (mins, s) ->  let secs = round (s * 60) in
  21.      pack $ fill mins <> ":" <> fill secs where
  22.        fill n = if n `elem` [0..9] then "0" <> show n else show n
Advertisement
Add Comment
Please, Sign In to add comment