module UrlPath
( UrlReader (..)
, Url (..)
, module UrlPath.Types ) where
import UrlPath.Types
import Data.String
import Data.Monoid
import Control.Applicative
import Control.Monad
import Control.Monad.Trans
import Control.Monad.Reader.Class
class ( IsString plain, Monoid plain, MonadReader plain (m plain) ) =>
Url plain (m :: * -> * -> *) where
url :: UrlString plain
-> m plain plain
plainUrl :: plain
-> m plain plain
class Url plain m => UrlReader plain m where
runUrlReader :: Url plain m =>
m plain b
-> plain
-> b
instance ( Monoid plain
, IsString plain ) => Url plain RelativeUrl where
url = RelativeUrl . const . expandRelative
plainUrl x = RelativeUrl $ const $ expandRelative $ UrlString x []
instance ( Monoid plain
, IsString plain ) => UrlReader plain RelativeUrl where
runUrlReader = runRelativeUrl
instance ( Monoid plain
, IsString plain ) => Url plain GroundedUrl where
url = GroundedUrl . const . expandGrounded
plainUrl x = GroundedUrl $ const $ expandGrounded $ UrlString x []
instance ( Monoid plain
, IsString plain ) => UrlReader plain GroundedUrl where
runUrlReader = runGroundedUrl
instance ( Monoid plain
, IsString plain ) => Url plain AbsoluteUrl where
url = expandAbsolute
plainUrl x = expandAbsolute $ UrlString x []
instance ( Monoid plain
, IsString plain ) => UrlReader plain AbsoluteUrl where
runUrlReader = runAbsoluteUrl
instance ( Monad m
, Monoid plain
, IsString plain ) => Url plain (RelativeUrlT m) where
url = RelativeUrlT . const . return . expandRelative
plainUrl x = RelativeUrlT $ const $ return $ expandRelative $ UrlString x []
instance ( Monad m
, Monoid plain
, IsString plain ) => Url plain (GroundedUrlT m) where
url = GroundedUrlT . const . return . expandGrounded
plainUrl x = GroundedUrlT $ const $ return $ expandGrounded $ UrlString x []
instance ( Monad m
, Monoid plain
, IsString plain ) => Url plain (AbsoluteUrlT m) where
url = expandAbsolute
plainUrl x = expandAbsolute $ UrlString x []