{-# LANGUAGE CPP #-}
module URL (
(+//+),
URL(..),
renderUrl,
removeSubpath
) where
import Data.List.Extra (dropSuffix)
#if MIN_VERSION_http_directory(0,1,9)
import Network.HTTP.Directory((+/+))
#endif
newtype URL = URL String
deriving Eq
renderUrl :: URL -> String
renderUrl (URL url) = url
foldSlash :: [String] -> String
foldSlash = foldr (+/+) ""
infixr 5 +//+
(+//+) :: URL -> [String] -> URL
(URL base) +//+ rel =
URL $ base +/+ foldSlash rel
-- piecesToPath :: [String] -> String
-- piecesToPath =
-- unsafeURI :: T.Text -> URI
-- unsafeURI u =
-- case mkURI u of
-- Nothing -> error $ "failed to parse url: " ++ show u
-- Just uri -> uri
#if !MIN_VERSION_http_directory(0,1,9)
infixr 5 +/+
(+/+) :: String -> String -> String
"" +/+ s = s
s +/+ "" = s
s +/+ t | last s == '/' = init s +/+ t
| head t == '/' = s +/+ tail t
s +/+ t = s ++ "/" ++ t
#endif
removeSubpath :: [String] -> String -> String
removeSubpath path url =
let url' = (if last url == '/' then init else id) url
in dropSuffix (foldSlash path) url'