packages feed

bein-0.3: Bein/Web/Elements/Base.hs

{-# LANGUAGE FlexibleInstances, Rank2Types, TypeSynonymInstances #-}
module Bein.Web.Elements.Base where

import Data.Monoid
import qualified Text.XHtml as X
import Text.XHtml ((!),HTML,Html,HtmlAttr,ADDATTRS)
import Control.Monad

(<!>) :: (ADDATTRS a, Monad m) => m a -> [HtmlAttr] -> m a
t <!> a = liftM (!a) t

(<!) :: (ADDATTRS a, Monad m) => (b -> m a) -> [HtmlAttr] -> (b -> m a)
t <! a = \x -> t x <!> a

(=<<:) :: Monad m => TagM -> [m Html] -> m Html
f =<<: gs = f =<< mconcatM gs

infixr 1 =<<:

(<<) :: (Monad m, HTML a) => TagM -> a -> m  Html
t << v = t =<< html v

infixr 7 <<

type TagM = Monad m => Html -> m Html
type ITagM = Monad m => m Html 

html :: (Monad m, HTML a) => a -> m Html
html = return . X.toHtml

noHtmlM :: Monad m => m Html
noHtmlM = return X.noHtml

noHtml :: Html
noHtml = X.noHtml

mconcatM :: (Monad m, Monoid a) => [m a] -> m a
mconcatM [] = return mempty
mconcatM (x:xs) = do
  v <- x
  vs <- mconcatM xs
  return (v `mappend` vs)