Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- {-# LANGUAGE OverloadedStrings #-}
- import Reflex.Dom
- import Data.Text
- import Data.Time.Clock
- import Data.Monoid ((<>))
- import Control.Monad.Fix
- import Control.Monad.Trans
- timerWidget :: MonadWidget t m => Integer -> m ()
- timerWidget maxTime = do
- t0 <- liftIO getCurrentTime
- eStart <- button "Start"
- ePause <- button "Pause"
- eTick <- tickLossy 1.0 t0
- let dTimer' = timer' t0 maxTime eStart ePause eTick
- dynText =<< dTimer'
- timer' :: MonadWidget t m =>
- UTCTime -> Integer -> Event t () -> Event t () -> Event t TickInfo -> m (Dynamic t Text)
- timer' t maxTime eStart ePause eTick = do
- beStartStop <- hold never . leftmost $ [ ((0+) <$ eTick) <$ ePause, ((1+) <$ eTick) <$ eStart ]
- let eSwitch = switch beStartStop
- fmap (formatS maxTime) <$> foldDyn ($) 0 eSwitch
- formatS :: Integer -> Integer -> Text
- formatS max cur =
- case properFraction (fromInteger (max-cur) / 60) of
- (mins, s) -> let secs = round (s * 60) in
- pack $ fill mins <> ":" <> fill secs where
- fill n = if n `elem` [0..9] then "0" <> show n else show n
- main = mainWidget $ timerWidget 120
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement