{-# LANGUAGE FlexibleContexts #-}
{-# LANGUAGE DataKinds #-}
{-# LANGUAGE PolyKinds #-}
{-# LANGUAGE GADTs #-}
{-# LANGUAGE TypeOperators #-}
{-# LANGUAGE ScopedTypeVariables #-}
{-# OPTIONS_GHC -fwarn-incomplete-patterns #-}
module Knit.Effect.Html
(
Lucid
, LucidDocs
, lucid
, lucidToNamedText
, lucidHtml
, lucidToText
, newLucidDoc
, Blaze
, BlazeDocs
, blaze
, blazeToNamedText
, blazeHtml
, blazeToText
, newBlazeDoc
, DocWithInfo(..)
)
where
import qualified Polysemy as P
import qualified Polysemy.Writer as P
import qualified Lucid as LH
import qualified Text.Blaze.Html as BH
import qualified Text.Blaze.Html.Renderer.Text as BH
import qualified Data.Text.Lazy as TL
import qualified Data.Text as T
import Knit.Effect.Docs ( Docs
, DocWithInfo(..)
, newDoc
, toDocList
)
type Lucid = P.Writer (LH.Html ())
type Blaze = P.Writer BH.Html
lucid :: P.Member Lucid effs => LH.Html () -> P.Sem effs ()
lucid :: Html () -> Sem effs ()
lucid = Html () -> Sem effs ()
forall o (r :: [Effect]).
MemberWithError (Writer o) r =>
o -> Sem r ()
P.tell
blaze :: P.Member Blaze effs => BH.Html -> P.Sem effs ()
blaze :: Html -> Sem effs ()
blaze = Html -> Sem effs ()
forall o (r :: [Effect]).
MemberWithError (Writer o) r =>
o -> Sem r ()
P.tell
type LucidDocs = Docs T.Text (LH.Html ())
type BlazeDocs = Docs T.Text BH.Html
newLucidDoc
:: P.Member LucidDocs effs
=> T.Text
-> P.Sem (Lucid ': effs) ()
-> P.Sem effs ()
newLucidDoc :: Text -> Sem (Lucid : effs) () -> Sem effs ()
newLucidDoc n :: Text
n l :: Sem (Lucid : effs) ()
l = (((Html (), ()) -> Html ())
-> Sem effs (Html (), ()) -> Sem effs (Html ())
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
fmap (Html (), ()) -> Html ()
forall a b. (a, b) -> a
fst (Sem effs (Html (), ()) -> Sem effs (Html ()))
-> Sem effs (Html (), ()) -> Sem effs (Html ())
forall a b. (a -> b) -> a -> b
$ Sem (Lucid : effs) () -> Sem effs (Html (), ())
forall o (r :: [Effect]) a.
Monoid o =>
Sem (Writer o : r) a -> Sem r (o, a)
P.runWriter Sem (Lucid : effs) ()
l) Sem effs (Html ()) -> (Html () -> Sem effs ()) -> Sem effs ()
forall (m :: * -> *) a b. Monad m => m a -> (a -> m b) -> m b
>>= Text -> Html () -> Sem effs ()
forall i a (effs :: [Effect]).
Member (Docs i a) effs =>
i -> a -> Sem effs ()
newDoc Text
n
newBlazeDoc
:: P.Member BlazeDocs effs
=> T.Text
-> P.Sem (Blaze ': effs) ()
-> P.Sem effs ()
newBlazeDoc :: Text -> Sem (Blaze : effs) () -> Sem effs ()
newBlazeDoc n :: Text
n l :: Sem (Blaze : effs) ()
l = (((Html, ()) -> Html) -> Sem effs (Html, ()) -> Sem effs Html
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
fmap (Html, ()) -> Html
forall a b. (a, b) -> a
fst (Sem effs (Html, ()) -> Sem effs Html)
-> Sem effs (Html, ()) -> Sem effs Html
forall a b. (a -> b) -> a -> b
$ Sem (Blaze : effs) () -> Sem effs (Html, ())
forall o (r :: [Effect]) a.
Monoid o =>
Sem (Writer o : r) a -> Sem r (o, a)
P.runWriter Sem (Blaze : effs) ()
l) Sem effs Html -> (Html -> Sem effs ()) -> Sem effs ()
forall (m :: * -> *) a b. Monad m => m a -> (a -> m b) -> m b
>>= Text -> Html -> Sem effs ()
forall i a (effs :: [Effect]).
Member (Docs i a) effs =>
i -> a -> Sem effs ()
newDoc Text
n
lucidToNamedText
:: P.Sem (LucidDocs ': effs) () -> P.Sem effs [DocWithInfo T.Text TL.Text]
lucidToNamedText :: Sem (LucidDocs : effs) () -> Sem effs [DocWithInfo Text Text]
lucidToNamedText = ([DocWithInfo Text (Html ())] -> [DocWithInfo Text Text])
-> Sem effs [DocWithInfo Text (Html ())]
-> Sem effs [DocWithInfo Text Text]
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
fmap ((DocWithInfo Text (Html ()) -> DocWithInfo Text Text)
-> [DocWithInfo Text (Html ())] -> [DocWithInfo Text Text]
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
fmap ((Html () -> Text)
-> DocWithInfo Text (Html ()) -> DocWithInfo Text Text
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
fmap Html () -> Text
forall a. Html a -> Text
LH.renderText)) (Sem effs [DocWithInfo Text (Html ())]
-> Sem effs [DocWithInfo Text Text])
-> (Sem (LucidDocs : effs) ()
-> Sem effs [DocWithInfo Text (Html ())])
-> Sem (LucidDocs : effs) ()
-> Sem effs [DocWithInfo Text Text]
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Sem (LucidDocs : effs) () -> Sem effs [DocWithInfo Text (Html ())]
forall i a (effs :: [Effect]).
Sem (Docs i a : effs) () -> Sem effs [DocWithInfo i a]
toDocList
blazeToNamedText
:: P.Sem (BlazeDocs ': effs) () -> P.Sem effs [DocWithInfo T.Text TL.Text]
blazeToNamedText :: Sem (BlazeDocs : effs) () -> Sem effs [DocWithInfo Text Text]
blazeToNamedText = ([DocWithInfo Text Html] -> [DocWithInfo Text Text])
-> Sem effs [DocWithInfo Text Html]
-> Sem effs [DocWithInfo Text Text]
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
fmap ((DocWithInfo Text Html -> DocWithInfo Text Text)
-> [DocWithInfo Text Html] -> [DocWithInfo Text Text]
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
fmap ((Html -> Text) -> DocWithInfo Text Html -> DocWithInfo Text Text
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
fmap Html -> Text
BH.renderHtml)) (Sem effs [DocWithInfo Text Html]
-> Sem effs [DocWithInfo Text Text])
-> (Sem (BlazeDocs : effs) () -> Sem effs [DocWithInfo Text Html])
-> Sem (BlazeDocs : effs) ()
-> Sem effs [DocWithInfo Text Text]
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Sem (BlazeDocs : effs) () -> Sem effs [DocWithInfo Text Html]
forall i a (effs :: [Effect]).
Sem (Docs i a : effs) () -> Sem effs [DocWithInfo i a]
toDocList
lucidHtml :: P.Sem (Lucid ': effs) () -> P.Sem effs (LH.Html ())
lucidHtml :: Sem (Lucid : effs) () -> Sem effs (Html ())
lucidHtml = ((Html (), ()) -> Html ())
-> Sem effs (Html (), ()) -> Sem effs (Html ())
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
fmap (Html (), ()) -> Html ()
forall a b. (a, b) -> a
fst (Sem effs (Html (), ()) -> Sem effs (Html ()))
-> (Sem (Lucid : effs) () -> Sem effs (Html (), ()))
-> Sem (Lucid : effs) ()
-> Sem effs (Html ())
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Sem (Lucid : effs) () -> Sem effs (Html (), ())
forall o (r :: [Effect]) a.
Monoid o =>
Sem (Writer o : r) a -> Sem r (o, a)
P.runWriter
lucidToText :: P.Sem (Lucid ': effs) () -> P.Sem effs TL.Text
lucidToText :: Sem (Lucid : effs) () -> Sem effs Text
lucidToText = (Html () -> Text) -> Sem effs (Html ()) -> Sem effs Text
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
fmap Html () -> Text
forall a. Html a -> Text
LH.renderText (Sem effs (Html ()) -> Sem effs Text)
-> (Sem (Lucid : effs) () -> Sem effs (Html ()))
-> Sem (Lucid : effs) ()
-> Sem effs Text
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Sem (Lucid : effs) () -> Sem effs (Html ())
forall (effs :: [Effect]).
Sem (Lucid : effs) () -> Sem effs (Html ())
lucidHtml
blazeHtml :: P.Sem (Blaze ': effs) () -> P.Sem effs BH.Html
blazeHtml :: Sem (Blaze : effs) () -> Sem effs Html
blazeHtml = ((Html, ()) -> Html) -> Sem effs (Html, ()) -> Sem effs Html
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
fmap (Html, ()) -> Html
forall a b. (a, b) -> a
fst (Sem effs (Html, ()) -> Sem effs Html)
-> (Sem (Blaze : effs) () -> Sem effs (Html, ()))
-> Sem (Blaze : effs) ()
-> Sem effs Html
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Sem (Blaze : effs) () -> Sem effs (Html, ())
forall o (r :: [Effect]) a.
Monoid o =>
Sem (Writer o : r) a -> Sem r (o, a)
P.runWriter
blazeToText :: P.Sem (Blaze ': effs) () -> P.Sem effs TL.Text
blazeToText :: Sem (Blaze : effs) () -> Sem effs Text
blazeToText = (Html -> Text) -> Sem effs Html -> Sem effs Text
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
fmap Html -> Text
BH.renderHtml (Sem effs Html -> Sem effs Text)
-> (Sem (Blaze : effs) () -> Sem effs Html)
-> Sem (Blaze : effs) ()
-> Sem effs Text
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Sem (Blaze : effs) () -> Sem effs Html
forall (effs :: [Effect]). Sem (Blaze : effs) () -> Sem effs Html
blazeHtml