module Data.Url
( UrlReader (..)
, Url (..)
, module Data.Url.Types ) where
import Data.Url.Types
import Data.String
import Data.Monoid
import Data.Monoid.Textual (TextualMonoid)
import Control.Applicative
import Control.Monad
import Control.Monad.Trans
import Control.Monad.Reader.Class
class ( TextualMonoid plain
, MonadReader plain m
) => Url plain (m :: * -> *) where
url :: UrlString plain
-> m plain
plainUrl :: plain
-> m plain
class Url plain m => UrlReader plain m where
type Result m :: * -> *
runUrlReader :: Url plain m =>
m b
-> plain
-> Result m b
instance ( Monad m
, TextualMonoid plain ) => Url plain (RelativeUrlT plain m) where
url = RelativeUrlT . const . return . expandRelative
plainUrl x = RelativeUrlT $ const $ return $ expandRelative $ UrlString x []
instance ( Monad m
, TextualMonoid plain ) => UrlReader plain (RelativeUrlT plain m) where
type Result (RelativeUrlT plain m) = m
runUrlReader = runRelativeUrlT
instance ( Monad m
, TextualMonoid plain ) => Url plain (GroundedUrlT plain m) where
url = GroundedUrlT . const . return . expandGrounded
plainUrl x = GroundedUrlT $ const $ return $ expandGrounded $ UrlString x []
instance ( Monad m
, TextualMonoid plain ) => UrlReader plain (GroundedUrlT plain m) where
type Result (GroundedUrlT plain m) = m
runUrlReader = runGroundedUrlT
instance ( Monad m
, TextualMonoid plain ) => Url plain (AbsoluteUrlT plain m) where
url = expandAbsolute
plainUrl x = expandAbsolute $ UrlString x []
instance ( Monad m
, TextualMonoid plain ) => UrlReader plain (AbsoluteUrlT plain m) where
type Result (AbsoluteUrlT plain m) = m
runUrlReader = runAbsoluteUrlT