module Web.Route.Invertible.Host
( HostString
, splitHost
, joinHost
, Host(..)
, renderHost
) where
import Prelude hiding (lookup)
import Control.Invertible.Monoidal
import qualified Data.ByteString as BS
import qualified Data.ByteString.Char8 as BSC
import qualified Data.Invertible as I
import Data.String (IsString(..))
import Web.Route.Invertible.Parameter
import Web.Route.Invertible.Placeholder
import Web.Route.Invertible.Sequence
type HostString = BS.ByteString
splitHost :: BS.ByteString -> [HostString]
splitHost = reverse . BSC.split '.'
joinHost :: [HostString] -> BS.ByteString
joinHost = BS.intercalate (BSC.singleton '.') . reverse
newtype Host a = HostRev { hostSequence :: Sequence HostString a }
deriving (I.Functor, MonoidalAlt, Parameterized HostString, Show)
instance Monoidal Host where
unit = HostRev unit
HostRev p >*< HostRev q = I.swap >$< HostRev (q >*< p)
instance IsString (Host ()) where
fromString s = HostRev $ mapI_ (placeholderSequence . PlaceholderFixed) $ splitHost $ fromString s
renderHost :: Host a -> a -> BS.ByteString
renderHost (HostRev p) a = joinHost $ renderSequence p a