module Web.Routes.Nested.Types.UrlChunks
(
o_
, origin_
, l_
, literal_
, p_
, parse_
, r_
, regex_
, pred_
, (</>)
,
EitherUrlChunk (..)
, UrlChunks (..)
) where
import Data.Attoparsec.Text
import Text.Regex
import Data.String (IsString (..))
import qualified Data.Text as T
data EitherUrlChunk (x :: Maybe *) where
(:=) :: T.Text -> EitherUrlChunk 'Nothing
(:~) :: (T.Text, T.Text -> Maybe r) -> EitherUrlChunk ('Just r)
instance x ~ 'Nothing => IsString (EitherUrlChunk x) where
fromString = literal_ . T.pack
o_, origin_ :: UrlChunks '[]
o_ = origin_
origin_ = Root
l_, literal_ :: T.Text -> EitherUrlChunk 'Nothing
l_ = literal_
literal_ = (:=)
p_, parse_ :: (T.Text, Parser r) -> EitherUrlChunk ('Just r)
p_ = parse_
parse_ (i,q) = (:~) (i, eitherToMaybe . parseOnly q)
r_, regex_ :: (T.Text, Regex) -> EitherUrlChunk ('Just [String])
r_ = regex_
regex_ (i,q) = (:~) (i, matchRegex q . T.unpack)
pred_ :: (T.Text, T.Text -> Maybe r) -> EitherUrlChunk ('Just r)
pred_ = (:~)
(</>) :: EitherUrlChunk mx -> UrlChunks xs -> UrlChunks (mx ': xs)
(</>) = Cons
infixr 9 </>
data UrlChunks (xs :: [Maybe *]) where
Cons :: EitherUrlChunk mx -> UrlChunks xs -> UrlChunks (mx ': xs)
Root :: UrlChunks '[]
eitherToMaybe :: Either String r -> Maybe r
eitherToMaybe (Right r') = Just r'
eitherToMaybe _ = Nothing