module Control.Monad.Apiary.Filter.Internal.Capture where
import Control.Applicative
import Control.Monad
import Control.Monad.Apiary.Action.Internal
import Control.Monad.Apiary.Internal
import Control.Monad.Apiary.Filter.Internal
import Data.Apiary.Compat
import Data.Apiary.Param
import Data.Apiary.Dict
import qualified Data.Text as T
import Text.Blaze.Html
path :: Monad actM => T.Text -> ApiaryT exts prms actM m () -> ApiaryT exts prms actM m ()
path p = focus' (DocPath p) Nothing (Exact p:) getParams
endPath :: (Monad actM) => ApiaryT exts prms actM m () -> ApiaryT exts prms actM m ()
endPath = focus' id Nothing (EndPath:) getParams
fetch' :: (NotMember k prms, KnownSymbol k, Path p, Monad actM) => proxy k -> proxy' p -> Maybe Html
-> ApiaryT exts (k := p ': prms) actM m () -> ApiaryT exts prms actM m ()
fetch' k p h = focus' (DocFetch (T.pack $ symbolVal k) (pathRep p) h) Nothing (FetchPath:) $ liftM actionFetches getState >>= \case
[] -> mzero
f:fs -> case readPathAs p f of
Just r -> do
modifyState (\s -> s {actionFetches = fs})
insert k r <$> getParams
Nothing -> mzero
fetch :: forall proxy k p exts prms actM m. (NotMember k prms, KnownSymbol k, Path p, Monad actM)
=> proxy (k := p) -> Maybe Html
-> ApiaryT exts (k := p ': prms) actM m () -> ApiaryT exts prms actM m ()
fetch _ h = fetch' k p h
where
k = Proxy :: Proxy k
p = Proxy :: Proxy p
anyPath :: (Monad m, Monad actM) => ApiaryT exts prms actM m () -> ApiaryT exts prms actM m ()
anyPath = focus' DocAny Nothing (RestPath:) getParams
restPath :: (NotMember k prms, KnownSymbol k, Monad m, Monad actM)
=> proxy k -> Maybe Html -> ApiaryT exts (k := [T.Text] ': prms) actM m () -> ApiaryT exts prms actM m ()
restPath k h = focus' (DocRest (T.pack $ symbolVal k) h) Nothing (RestPath:) $ getParams >>= \l -> liftM actionFetches getState >>= \case
[] -> return $ insert k [] l
fs -> insert k fs l <$ modifyState (\s -> s {actionFetches = []})