module Web.Routes.Nested.Match
(
o_
, origin_
, l_
, literal_
, f_
, file_
, p_
, parse_
, r_
, regex_
, pred_
, (</>)
,
EitherUrlChunk
, UrlChunks
) where
import Prelude hiding (pred)
import Data.Attoparsec.Text
import Text.Regex
import qualified Data.Text as T
import Control.Monad
import Control.Error (hush)
import Data.Trie.Pred
o_, origin_ :: UrlChunks '[]
o_ = origin_
origin_ = nil
l_, literal_ :: T.Text -> EitherUrlChunk 'Nothing
l_ = literal_
literal_ = only
f_, file_ :: T.Text -> EitherUrlChunk ('Just T.Text)
f_ = file_
file_ f = pred_ f (\t -> t <$ guard (fst (T.breakOn "." t) == f))
p_, parse_ :: T.Text -> Parser r -> EitherUrlChunk ('Just r)
p_ = parse_
parse_ i q = pred_ i (hush . parseOnly q)
r_, regex_ :: T.Text -> Regex -> EitherUrlChunk ('Just [String])
r_ = regex_
regex_ i q = pred_ i (matchRegex q . T.unpack)
pred_ :: T.Text -> (T.Text -> Maybe r) -> EitherUrlChunk ('Just r)
pred_ = pred
type EitherUrlChunk = PathChunk T.Text
type UrlChunks = PathChunks T.Text
(</>) :: EitherUrlChunk mx -> UrlChunks xs -> UrlChunks (mx ': xs)
(</>) = (./)
infixr 9 </>