module Reflex.Dom.Colonnade where import Colonnade.Types import Control.Monad import Reflex (Dynamic) import Reflex.Dynamic (mapDyn) import Reflex.Dom (MonadWidget) import Reflex.Dom.Widget.Basic import Data.Map (Map) import qualified Data.Map as Map cell :: m () -> Cell m cell = Cell Map.empty data Cell m = Cell { cellAttrs :: Map String String , cellContents :: m () } basic :: (MonadWidget t m, Foldable f) => Map String String -- ^ Table element attributes -> f a -- ^ Values -> Encoding Headed (Cell m) a -- ^ Encoding of a value into cells -> m () basic tableAttrs as (Encoding v) = do elAttr "table" tableAttrs $ do el "thead" $ el "tr" $ forM_ v $ \(Headed (Cell attrs contents),_) -> elAttr "th" attrs contents el "tbody" $ forM_ as $ \a -> do el "tr" $ forM_ v $ \(_,encode) -> do let Cell attrs contents = encode a elAttr "td" attrs contents dynamic :: (MonadWidget t m, Foldable f) => Map String String -- ^ Table element attributes -> f (Dynamic t a) -- ^ Dynamic values -> Encoding Headed (Cell m) a -- ^ Encoding of a value into cells -> m () dynamic tableAttrs as (Encoding v) = do elAttr "table" tableAttrs $ do el "thead" $ el "tr" $ forM_ v $ \(Headed (Cell attrs contents),_) -> elAttr "th" attrs contents el "tbody" $ forM_ as $ \a -> do el "tr" $ forM_ v $ \(_,encode) -> do dynPair <- mapDyn encode a dynAttrs <- mapDyn cellAttrs dynPair dynContent <- mapDyn cellContents dynPair _ <- elDynAttr "td" dynAttrs $ dyn dynContent return ()