{-# LANGUAGE CPP #-} module URL ( (+//+), URL(..), renderUrl, FileDir(..), removeSubpath ) where import Data.List.Extra (dropSuffix, dropWhileEnd) newtype URL = URL String deriving Eq data FileDir = File | Dir deriving Eq renderUrl :: FileDir -> URL -> String renderUrl Dir (URL url) = trailingSlash url renderUrl File (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 -- from http-directory infixr 5 +/+ (+/+) :: String -> String -> String s +/+ t = case (s,t) of ("",_) -> t (_,"") -> s (_,_) -> dropWhileEnd (== '/') s ++ '/' : dropWhile (== '/') t removeSubpath :: [String] -> String -> String removeSubpath path url = let url' = (if last url == '/' then init else id) url in dropSuffix (foldSlash path) url' -- from http-directory trailingSlash :: String -> String trailingSlash "" = "" trailingSlash str = if last str == '/' then str else str ++ "/"