|
| 1 | +{-# LANGUAGE OverloadedStrings, RecursiveDo, ScopedTypeVariables, FlexibleContexts, TypeFamilies, ConstraintKinds #-} |
| 2 | + |
| 3 | +import Prelude hiding (mapM, mapM_, all, sequence) |
| 4 | + |
| 5 | +import Control.Monad hiding (mapM, mapM_, forM, forM_, sequence) |
| 6 | +import Control.Monad.Fix |
| 7 | +import Data.Map (Map) |
| 8 | +import qualified Data.Map as Map |
| 9 | +import Data.Foldable |
| 10 | +import Data.Monoid ((<>)) |
| 11 | +import Data.Text (Text) |
| 12 | +import qualified Data.Text as T |
| 13 | + |
| 14 | +import GHCJS.DOM.Types (JSM) |
| 15 | + |
| 16 | +import Reflex |
| 17 | +import Reflex.Dom.Core |
| 18 | +import Data.Text.Encoding (encodeUtf8) |
| 19 | + |
| 20 | + |
| 21 | +main = mainWidget app |
| 22 | + |
| 23 | +evenButton :: [Int] -> Bool |
| 24 | +evenButton [] = False |
| 25 | +evenButton [x] = even x |
| 26 | + |
| 27 | +dynListToMap :: (Ord k, (Functor (Dynamic t))) => Dynamic t [k] -> Dynamic t (Map k k) |
| 28 | +dynListToMap l = ffor l (Map.fromList . (map $ \x -> (x, x))) |
| 29 | + |
| 30 | +listListView :: (Ord k, (Functor (Dynamic t)), Adjustable t m, PostBuild t m, MonadFix m, MonadHold t m) => Dynamic t [k] -> (k -> Dynamic t k -> m (Event t a)) -> m (Event t [k]) |
| 31 | +listListView l = do |
| 32 | + events <- listViewWithKey $ dynListToMap l |
| 33 | + return (fmap (fmap Map.keys) events) |
| 34 | + |
| 35 | +dynTextButton :: (Adjustable t m, PostBuild t m, MonadFix m, MonadHold t m, DomBuilder t m, Show a) => Dynamic t a -> m (Event t ()) |
| 36 | +dynTextButton dynString = do |
| 37 | + rec |
| 38 | + (el,_) <- el' "button" $ do |
| 39 | + dynText $ fmap (T.pack . show) dynString |
| 40 | + return (domEvent Click el) |
| 41 | + |
| 42 | +app :: ( DomBuilder t m , DomBuilderSpace m ~ GhcjsDomSpace , MonadFix m , MonadHold t m, PostBuild t m) => m () |
| 43 | +app = do |
| 44 | + |
| 45 | + rec |
| 46 | + countedClicks <- foldDyn (\a b -> if evenButton a then b + 2 else b) 2 clicks |
| 47 | + |
| 48 | + clicks <- listListView (ffor countedClicks (\n -> [1..n])) (\ _ x -> dynTextButton x) |
| 49 | + |
| 50 | + |
| 51 | + return () |
| 52 | + |
0 commit comments