diff --git a/reflex-dom-colonnade/src/Reflex/Dom/Colonnade.hs b/reflex-dom-colonnade/src/Reflex/Dom/Colonnade.hs index bc06114..04779f9 100644 --- a/reflex-dom-colonnade/src/Reflex/Dom/Colonnade.hs +++ b/reflex-dom-colonnade/src/Reflex/Dom/Colonnade.hs @@ -12,11 +12,9 @@ module Reflex.Dom.Colonnade -- * Table Encoders , basic , static - , eventful - , dynamic - , dynamicEventful , capped - , cappedEventful + , dynamic + , dynamicCapped -- * Cell Functions , cell , charCell @@ -32,10 +30,8 @@ import qualified Data.Text.Lazy as LT import qualified Data.Text.Lazy.Builder as LT import qualified Data.Map.Strict as M import Data.Foldable (Foldable(..),for_) -import Data.Traversable (for) import Data.Semigroup (Semigroup(..)) import Control.Applicative (liftA2) -import Control.Monad (void) import Reflex.Dom import Colonnade (Colonnade,Headed,Fascia,Cornice) import qualified Colonnade.Encode as E @@ -107,15 +103,15 @@ body bodyAttrs trAttrs colonnade collection = E.rowMonoidal colonnade (WrappedApplicative . elFromCell "td") a static :: - (DomBuilder t m, PostBuild t m, Foldable f, Foldable h) + (DomBuilder t m, PostBuild t m, Foldable f, Foldable h, Monoid e) => M.Map T.Text T.Text -- ^ @\@ tag attributes -> Maybe (M.Map T.Text T.Text, M.Map T.Text T.Text) -- ^ Attributes of @\@ and its @\@, pass 'Nothing' to omit @\@ -> M.Map T.Text T.Text -- ^ @\@ tag attributes -> (a -> M.Map T.Text T.Text) -- ^ @\@ tag attributes - -> Colonnade h a (Cell t m ()) -- ^ Data encoding strategy + -> Colonnade h a (Cell t m e) -- ^ Data encoding strategy -> f a -- ^ Collection of data - -> m () + -> m e static tableAttrs mheadAttrs bodyAttrs trAttrs colonnade collection = elAttr "table" tableAttrs $ do for_ mheadAttrs $ \(headAttrs,headTrAttrs) -> @@ -123,114 +119,91 @@ static tableAttrs mheadAttrs bodyAttrs trAttrs colonnade collection = E.headerMonadicGeneral_ colonnade (elFromCell "th") body bodyAttrs trAttrs colonnade collection -eventful :: - (DomBuilder t m, PostBuild t m, Foldable f, Foldable h, Semigroup e) +encodeCorniceHead :: + (DomBuilder t m, PostBuild t m, Monoid e) + => M.Map T.Text T.Text + -> Fascia p (M.Map T.Text T.Text) + -> E.AnnotatedCornice p a (Cell t m e) + -> m e +encodeCorniceHead headAttrs fascia annCornice = + elAttr "thead" headAttrs (unWrappedApplicative thead) + where thead = E.headersMonoidal (Just (fascia, addAttr)) [(th,id)] annCornice + th size (Cell attrs contents) = WrappedApplicative (elDynAttr "th" (fmap addColspan attrs) contents) + where addColspan = M.insert "colspan" (T.pack (show size)) + addAttr attrs = WrappedApplicative . elAttr "tr" attrs . unWrappedApplicative + +capped :: + (DomBuilder t m, PostBuild t m, MonadHold t m, Foldable f, Monoid e) => M.Map T.Text T.Text -- ^ @\@ tag attributes - -> Maybe (M.Map T.Text T.Text, M.Map T.Text T.Text) - -- ^ Attributes of @\@ and its @\@, pass 'Nothing' to omit @\@ + -> M.Map T.Text T.Text -- ^ @\@ tag attributes -> M.Map T.Text T.Text -- ^ @\@ tag attributes -> (a -> M.Map T.Text T.Text) -- ^ @\@ tag attributes - -> Colonnade h a (Cell t m (Event t e)) -- ^ Data encoding strategy + -> Fascia p (M.Map T.Text T.Text) -- ^ Attributes for @\@ elements in the @\@ + -> Cornice p a (Cell t m e) -- ^ Data encoding strategy -> f a -- ^ Collection of data - -> m (Event t e) -eventful tableAttrs mheadAttrs bodyAttrs trAttrs colonnade collection = + -> m e +capped tableAttrs headAttrs bodyAttrs trAttrs fascia cornice collection = elAttr "table" tableAttrs $ do - eHead <- for mheadAttrs $ \(headAttrs,headTrAttrs) -> - elAttr "thead" headAttrs . elAttr "tr" headTrAttrs $ - E.headerMonadicGeneral colonnade (elFromCell "th") - eBody <- body bodyAttrs trAttrs colonnade collection - return (maybe never id eHead <> eBody) + h <- encodeCorniceHead headAttrs fascia (E.annotate cornice) + b <- body bodyAttrs trAttrs (E.discard cornice) collection + return (h `mappend` b) dynamicBody :: (DomBuilder t m, PostBuild t m, Foldable f, Semigroup e, Monoid e) => Dynamic t (M.Map T.Text T.Text) -> (a -> M.Map T.Text T.Text) -> Colonnade p a (Cell t m e) - -> f (Dynamic t a) + -> Dynamic t (f a) -> m (Event t e) -dynamicBody bodyAttrs trAttrs colonnade collection = - elDynAttr "tbody" bodyAttrs . unWrappedApplicative . flip foldMap collection $ \aDyn -> - WrappedApplicative . - elDynAttr "tr" (fmap trAttrs aDyn) $ - dyn (fmap (unWrappedApplicative . E.rowMonoidal colonnade (WrappedApplicative . elFromCell "td")) aDyn) +dynamicBody bodyAttrs trAttrs colonnade dynCollection = + elDynAttr "tbody" bodyAttrs . dyn . ffor dynCollection $ \collection -> + unWrappedApplicative . + flip foldMap collection $ \a -> + WrappedApplicative . + elAttr "tr" (trAttrs a) . + unWrappedApplicative . E.rowMonoidal colonnade (WrappedApplicative . elFromCell "td") $ a dynamic :: - (DomBuilder t m, PostBuild t m, Foldable f, Foldable h) + (DomBuilder t m, PostBuild t m, Foldable f, Foldable h, Semigroup e, Monoid e) => Dynamic t (M.Map T.Text T.Text) -- ^ @\@ tag attributes -> Maybe (Dynamic t (M.Map T.Text T.Text), Dynamic t (M.Map T.Text T.Text)) -- ^ Attributes of @\@ and its @\@, pass 'Nothing' to omit @\@ -> Dynamic t (M.Map T.Text T.Text) -- ^ @\@ tag attributes -> (a -> M.Map T.Text T.Text) -- ^ @\@ tag attributes - -> Colonnade h a (Cell t m ()) -- ^ Data encoding strategy - -> f (Dynamic t a) -- ^ Collection of data - -> m () + -> Colonnade h a (Cell t m e) -- ^ Data encoding strategy + -> Dynamic t (f a) -- ^ Collection of data + -> m (Event t e) dynamic tableAttrs mheadAttrs bodyAttrs trAttrs colonnade collection = elDynAttr "table" tableAttrs $ do for_ mheadAttrs $ \(headAttrs,headTrAttrs) -> elDynAttr "thead" headAttrs . elDynAttr "tr" headTrAttrs $ E.headerMonadicGeneral_ colonnade (elFromCell "th") - void (dynamicBody bodyAttrs trAttrs colonnade collection) + dynamicBody bodyAttrs trAttrs colonnade collection -dynamicEventful :: - (DomBuilder t m, PostBuild t m, MonadHold t m, Foldable f, Foldable h, Semigroup e) - => Dynamic t (M.Map T.Text T.Text) -- ^ @\@ tag attributes - -> Maybe (Dynamic t (M.Map T.Text T.Text), Dynamic t (M.Map T.Text T.Text)) - -- ^ Attributes of @\@ and its @\@, pass 'Nothing' to omit @\@ - -> Dynamic t (M.Map T.Text T.Text) -- ^ @\@ tag attributes - -> (a -> M.Map T.Text T.Text) -- ^ @\@ tag attributes - -> Colonnade h a (Cell t m (Event t e)) -- ^ Data encoding strategy - -> f (Dynamic t a) -- ^ Collection of data - -> m (Event t e) -dynamicEventful tableAttrs mheadAttrs bodyAttrs trAttrs colonnade collection = - elDynAttr "table" tableAttrs $ do - eHead <- for mheadAttrs $ \(headAttrs,headTrAttrs) -> - elDynAttr "thead" headAttrs . elDynAttr "tr" headTrAttrs $ - E.headerMonadicGeneral colonnade (elFromCell "th") - eeBody <- dynamicBody bodyAttrs trAttrs colonnade collection - eBody <- hold never eeBody - return (maybe never id eHead <> switch eBody) - -encodeCorniceHead :: +encodeCorniceHeadDynamic :: (DomBuilder t m, PostBuild t m, Monoid e) => Dynamic t (M.Map T.Text T.Text) -> Fascia p (Dynamic t (M.Map T.Text T.Text)) -> E.AnnotatedCornice p a (Cell t m e) -> m e -encodeCorniceHead headAttrs fascia annCornice = +encodeCorniceHeadDynamic headAttrs fascia annCornice = elDynAttr "thead" headAttrs (unWrappedApplicative thead) where thead = E.headersMonoidal (Just (fascia, addAttr)) [(th,id)] annCornice th size (Cell attrs contents) = WrappedApplicative (elDynAttr "th" (fmap addColspan attrs) contents) where addColspan = M.insert "colspan" (T.pack (show size)) addAttr attrs = WrappedApplicative . elDynAttr "tr" attrs . unWrappedApplicative -capped :: - (DomBuilder t m, PostBuild t m, MonadHold t m, Foldable f) +dynamicCapped :: + (DomBuilder t m, PostBuild t m, MonadHold t m, Foldable f, Semigroup e, Monoid e) => Dynamic t (M.Map T.Text T.Text) -- ^ @\@ tag attributes -> Dynamic t (M.Map T.Text T.Text) -- ^ @\@ tag attributes -> Dynamic t (M.Map T.Text T.Text) -- ^ @\@ tag attributes -> (a -> M.Map T.Text T.Text) -- ^ @\@ tag attributes -> Fascia p (Dynamic t (M.Map T.Text T.Text)) -- ^ Attributes for @\@ elements in the @\@ - -> Cornice p a (Cell t m ()) -- ^ Data encoding strategy - -> f (Dynamic t a) -- ^ Collection of data - -> m () -capped tableAttrs headAttrs bodyAttrs trAttrs fascia cornice collection = - elDynAttr "table" tableAttrs $ do - encodeCorniceHead headAttrs fascia (E.annotate cornice) - void (dynamicBody bodyAttrs trAttrs (E.discard cornice) collection) - -cappedEventful :: - forall t m f e p a. - (DomBuilder t m, PostBuild t m, MonadHold t m, Foldable f, Semigroup e) - => Dynamic t (M.Map T.Text T.Text) -- ^ @\@ tag attributes - -> Dynamic t (M.Map T.Text T.Text) -- ^ @\@ tag attributes - -> Dynamic t (M.Map T.Text T.Text) -- ^ @\@ tag attributes - -> (a -> M.Map T.Text T.Text) -- ^ @\@ tag attributes - -> Fascia p (Dynamic t (M.Map T.Text T.Text)) -- ^ Attributes for @\@ elements in the @\@ - -> Cornice p a (Cell t m (Event t e)) -- ^ Data encoding strategy - -> f (Dynamic t a) -- ^ Collection of data + -> Cornice p a (Cell t m e) -- ^ Data encoding strategy + -> Dynamic t (f a) -- ^ Collection of data -> m (Event t e) -cappedEventful tableAttrs headAttrs bodyAttrs trAttrs fascia cornice collection = +dynamicCapped tableAttrs headAttrs bodyAttrs trAttrs fascia cornice collection = elDynAttr "table" tableAttrs $ do - eHead <- encodeCorniceHead headAttrs fascia (E.annotate cornice) - eeBody <- dynamicBody bodyAttrs trAttrs (E.discard cornice) collection - eBody <- hold never eeBody - return (eHead <> switch eBody) + -- TODO: Figure out what this ignored argument represents and dont ignore it + _ <- encodeCorniceHeadDynamic headAttrs fascia (E.annotate cornice) + dynamicBody bodyAttrs trAttrs (E.discard cornice) collection