module Html.Reify
( R(..)
) where
import Html.Type.Internal
import Html.Convert
import Html.CPP
import GHC.TypeLits
import Data.Proxy
import Data.Semigroup ((<>))
class R a where
render :: a -> Converted
instance
KnownSymbol s
=> R (Proxy (s :: Symbol)) where
render = convert
instance
R (Proxy ('[] :: [Symbol])) where
render _ = mempty
instance
( KnownSymbol x, R (Proxy xs)
) => R (Proxy ((x ': xs) :: [Symbol])) where
render _ = convert (Proxy @ x) <> render (Proxy @ xs)
instance
R (T '[] val) where
render _ = mempty
instance
( Convert val
) => R (T '[ EmptySym ] val) where
render (T x) = convert x
instance
R (T '[ EmptySym ] String) where
render (T x) = convert x
instance
( Convert b
, R (Proxy s)
) => R (T '[s] (a := b)) where
render (T (AT x)) = render (Proxy @ s) <> convert x
instance
( Convert val
, R (Proxy s)
) => R (T '[s] val) where
render (T x) = render (Proxy @ s) <> convert x
instance
( R (Proxy s)
) => R (T '[s] String) where
render (T x) = render (Proxy @ s) <> convert x
instance
( R (T xs val)
) => R (T (NoTail xs) val) where
render (T t) = render (T t :: T xs val)
instance
( R (T xs val)
, R (Proxy x)
) => R (T ('FingerTree xs x) val) where
render (T t) = render (T t :: T xs val) <> render (Proxy @ x)
instance
( R (T (Take (Length b) ps) b)
, R (T (Drop (Length b) ps) c)
) => R (T ps ((a :@: b) c)) where
render (T ~(WithAttributes b c))
= render (T b :: T (Take (Length b) ps) b)
<> render (T c :: T (Drop (Length b) ps) c)
instance
( R (T (Take (Length a) ps) a)
, R (T (Drop (Length a) ps) b)
) => R (T ps (a # b)) where
render (T ~(a :#: b))
= render (T a :: T (Take (Length a) ps) a)
<> render (T b :: T (Drop (Length a) ps) b)
instance
( R (T (ToList a) a)
, R (Proxy s)
) => R (T (s ': ss) [a]) where
render (T xs)
= render (Proxy @ s)
<> foldMap (render . newT) xs
instance
( R (T (ToList a) a)
, R (Proxy s)
) => R (T (s ': ss) (Maybe a)) where
render (T mx)
= render (Proxy @ s)
<> foldMap (render . newT) mx
instance
( R (T (ToList a) a)
, R (T (ToList b) b)
, R (Proxy s)
) => R (T (s ': ss) (Either a b)) where
render (T eab)
= render (Proxy @ s)
<> either (render . newT) (render . newT) eab
newT :: x -> T (ToList x) x
newT = T