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 |